Го Бест Працтицес - Руковање грешкама

Ово је први чланак у низу лекција које сам научио током неколико година колико сам радио са производњом Го. Водимо добар број Го услуга у производњи у Салтсиде Тецхнологиес (псст, ангажујем се на више позиција у Бангалореу за Салтсиде), а такође водим и сопствени посао где је Го саставни део.

Ми ћемо покрити широк спектар тема, великих и малих.

Први предмет који сам желео да покријем у овој серији је руковање грешкама. То често изазива збрку и неугодност за нове Го програмере.

Неке позадине - интерфејс грешке

Само да смо на истој страници. Као што можда знате да је грешка у Го-у једноставно све што имплементира интерфејс грешке. Овако изгледа дефиниција интерфејса:

унесите интерфејс грешке {
    Еррор () стринг
}

Дакле, све што имплементира Еррор () стринг метод може се користити као грешка.

Провера грешака

Коришћење структура грешака и провера типа

Када сам почео да пишем Го, често сам пратио стринг поређења порука о грешци да бих видео шта је врста грешке (да, срамотно је размишљати, али понекад је потребно да се осврнете да идете напред).

Бољи приступ је употреба типова грешака. На тај начин можете (наравно) креирати структуре које имплементирају интерфејс грешке и затим вршити упоређивање у изводу свитцх.

Ево примера примене грешке.

откуцајте ЕррЗероДивисион струцтуре {
    стринг стринг
}
фунц НевЕррЗероДивисион (низ порука) * ЕррЗероДивисион {
    ретурн & ЕррЗероДивисион {
        порука: порука,
    }
}
фунц (е * ЕррЗероДивисион) Еррор () стринг {
    вратити е.мессаге
}

Сада се ова грешка може користити овако.

фунц маин () {
    резултат, грешка: = подјела (1.0, 0.0)
    ако греши! = нил {
        грешка преклопника (тип) {
        случај * ЕррЗероДивисион:
            фмт.Принтлн (ерр.Еррор ())
        Уобичајено:
            фмт.Принтлн ("Шта се х * управо догодило?")
        }
    }
    фмт.Принтлн (резултат)
}
фунц делити (а, б флоат64) (флоат64, грешка) {
    ако је б == 0,0 {
        повратак 0.0, НевЕррЗероДивисион ("Не могу се поделити на нулу")
    }
    врати а / б, нил
}

Ево везе за Го Плаи за потпуни пример. Уочите образац грешке (типа) грешке, који омогућава проверу за различите типове грешака, а не нешто друго (као што је упоређивање низа или нешто слично).

Коришћење пакета грешака и директно упоређивање

Горњим приступом се алтернативно може руковати коришћењем пакета грешака. Овај приступ је препоручљив за провере грешака унутар пакета где вам је потребно брзо представљање грешака.

вар еррНотФоунд = еррорс.Нев ("Ставка није пронађена")
фунц маин () {
    ерр: = гетИтем (123) // Ово би бацило еррНотФоунд
    ако греши! = нил {
        свитцх ерр {
        цасе еррНотФоунд:
            лог.Принтлн ("Тражена ставка није пронађена")
        Уобичајено:
            лог.Принтлн ("Непозната грешка")
        }
    }
}

Овај приступ је мање добар када су вам потребни сложенији објекти о грешкама, нпр. кодови грешака итд. У том случају требали бисте креирати властити тип који имплементира интерфејс грешке.

Одмах руковање грешкама

Понекад наиђем на шифру као што је ниже (али обично са више паковања около ...):

фунц екампле1 () грешка {
    грешка: = цалл1 ()
    ретурн ерр
}

Поента је у томе да се грешка не решава одмах. Ово је крхки приступ јер неко може уметнути код између ерр: = цалл1 () и повратне грешке, што би разбило намјеру, јер то може засјенити прву грешку. Два алтернативна приступа:

// Сажми поврат и грешку.
фунц екампле2 () грешка {
    узвратни позив1 ()
}
// Изричите руковање грешкама одмах након позива.
фунц екампле3 () грешка {
    грешка: = цалл1 ()
    ако греши! = нил {
        ретурн ерр
    }
    ретурн нил
}

Оба горе наведена приступа су у реду са мном. Они постижу исту ствар, а то је; ако неко мора нешто додати након цалл1 (), мора да води рачуна о грешци.

То је све за данас

Пратите следећи чланак о Го Бест Працтицес. Иди јако :).

фунц маин () {
    ерр: = реадАртицле ("Најбоље праксе - руковање грешкама")
    ако греши! = нил {
        пинг ("@ себдах")
    }
}