Struktūrinis programavimas
Pamoka 10 / 11 Failai ir klaidų valdymas ~45 min
1 / 4 📖 Teorija

Klaida — ne sprogimas, o reikšmė

Failai — pirmoji vieta, kur programa susiduria su išoriniu pasauliu. O išorinis pasaulis nepatikimas: failo gali nebūti, diskas gali būti pilnas, teisės gali neleisti. Todėl Go čia visur taiko taisyklę, kurią jau pažįsti iš strconv.Atoi:

data, err := os.ReadFile("items.json")
if err != nil {
    // kas nors nepavyko — REAGUOJAM čia
}

Klaida Go kalboje — ne sprogimas, o paprasta grąžinama reikšmė. Funkcija nesugriauna programos; ji ramiai pasako „nepavyko, štai kodėl" ir palieka sprendimą tau. Kiekviena failo operacija grąžina error, ir kiekvieną privalai patikrinti.

Žemiausiame lygyje failas gyvena tris žingsnius: atidaryk → naudok → uždaryk. Atidarytas failas — užimtas resursas, todėl Go turi defer — „padaryk, kai funkcija baigsis, kad ir kas nutiktų":

f, err := os.Create("items.json")
if err != nil {
    return err
}
defer f.Close() // uždarymas užsakytas IŠ KARTO po atidarymo

Spąstai. Dvi nuodėmės, kurios „veikia" tavo kompiuteryje ir sugriauna programą pas kitus:

  1. Ignoruoti klaidą: data, _ := os.ReadFile(...) — failo nėra, data tuščias, o programa toliau apsimeta, kad viskas gerai, ir lūžta vėliau, toli nuo tikrosios priežasties. Klaidą tikrink ten, kur ji gimsta.
  2. Pamiršti defer f.Close(): neuždarytas failas — dar neįrašyti duomenys gali likti buferyje (failas lieka tuščias ar pusinis), o operacinė sistema laiko failą užimtą. Įprotis: parašei os.Create ar os.Openkita eilutė po klaidos patikros yra defer f.Close().

Gera žinia: kitame žingsnyje pamatysi, kad kasdieniam darbui Go duoda porą funkcijų, kurios atidarymą ir uždarymą sutvarko už tave — bet error patikra lieka TAVO darbas visada.