cpp

Обработка ошибок

Если вы когда-нибудь учились водить автомобиль, то наверняка вспомните, что при первой посадке на водительское сиденье все внимание было приковано к трем деталям: рулю, педалям и рычагу переключения передач. Происходящее вне автомобиля уходило на второй план, так как вначале нужно было стронуться с места. По мере практики навыки вождения улучшались и эти три детали постепенно уходили на задний план. Как ни странно, но руль и рычаг переключения передач всегда оказывались там, куда вы не смотря протягивали руки, а ноги сами находили педали. Теперь все внимание стало занимать происходящее на дороге. Иными словами, вы стали опытным водителем.

В программировании все абсолютно также. Начинающие программисты больше обращают внимание на первые попавшиеся на глаза операторы, функции и другие элементы языка, а сам алгоритм уходит на задний план. Если программа скомпилировалась без ошибок, то это уже большое счастье, хотя это еще не означает, что программа работает правильно. По мере практики мышление программиста меняется, он начинает обращать внимание на мелочи, на форматирование программы, использует более эффективные алгоритмы и в результате всего этого допускает меньше ошибок. Подводя итоги, можно сказать, что начинающий программист просто пишет программу, а опытный программист пытается найти оптимальный алгоритм и предусмотреть поведение программы в различных ситуациях. Однако, от ошибок никто не застрахован, поэтому очень важно знать как быстро найти ошибку.

Примечание

Типы ошибок

Существуют три типа ошибок в программе:

  • синтаксические — это ошибки в имени оператора или функции, отсутствие закрывающей или открывающей кавычек и т. д., то есть ошибки в синтаксисе языка. Как правило, компилятор предупредит о наличии ошибки, а программа не будет выполняться совсем. Пример синтаксической ошибки:
fmt.Println("Нет завершающей кавычки!)

При компиляции будет выведено следующее сообщение об ошибке:

# command-line-arguments
.\main.go:6:63: newline in string
.\main.go:6:63: syntax error: unexpected newline, 
expecting comma or )

Первое число после названия компилируемого файла и двоеточия обозначает номер строки, в которой обнаружена ошибка, а второе число — номер символа внутри строки. Достаточно найти строку с указанным номером в исходном коде и добавить закрывающую кавычку. Затем нужно заново скомпилировать программу;

  • логические — это ошибки в логике работы программы, которые можно выявить только по результатам работы программы. Как правило, компилятор не предупреждает о наличии ошибки, а программа будет выполняться, так как не содержит синтаксических ошибок. Логические ошибки достаточно трудно выявить, и их поиск часто заканчивается бессонными ночами.

Предположим, необходимо вывести первые три элемента слайса. Программист, забыв, что нумерация слайсов начинается с нуля, пишет следующий код:

arr := []int{1, 2, 3, 4}
for i := 1; i < 4; i++ {
   fmt.Println(arr[i])
}

В итоге возникает логическая ошибка, т. к. будут получены не первые элементы слайса, а три элемента начиная со второго. Так как в данном примере нет синтаксических ошибок, интерпретатор сочтет код правильным;

  • ошибки времени выполнения — это ошибки, которые возникают во время работы программы. В одних случаях ошибки времени выполнения являются следствием логических ошибок, а в других случаях причиной являются внешние события, например, нехватка оперативной памяти, отсутствие прав для записи в файл и др. В этом случае генерируется паника. Если в коде не предусмотрена обработка паники, то программа прерывается и выводится сообщение об ошибке.

Ошибка времени выполнения возникнет, например, при целочисленном делении на ноль или при обращении к несуществующему элементу слайса:

x := 0
y := 10 / x
fmt.Println(x, y)

Во время выполнения программы будет выведено следующее сообщение об ошибке:

panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.main()
        C:/book/test/main.go:8 +0x11
exit status 2
На заметку

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp