ПрограммированиеVB разработчик, VB.NET разработчик

Какие способы обработки ошибок существуют в Visual Basic? Объясните различие между On Error GoTo и Try...Catch (если речь о VB.NET).

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В Visual Basic для обработки ошибок используются конструкции On Error (VB6) и Try...Catch (VB.NET).

  • On Error GoTo <Label> — устаревший способ из VB6, реализует переход на указанный ярлык при ошибке. Не поддерживает вложенность, может вести к запутанному коду.
  • Try...Catch...Finally — современный способ (VB.NET), который позволяет работать с исключениями, дает возможность обрабатывать разные типы ошибок в разных блоках Catch и обязательно выполнять финальные действия в Finally.

Примеры:

VB6:

Sub OpenFile() On Error GoTo ErrorHandler Open "file.txt" For Input As #1 ' Чтение файла Close #1 Exit Sub ErrorHandler: MsgBox "Ошибка: " & Err.Description End Sub

VB.NET:

Sub OpenFileVBNet() Try Using reader As New StreamReader("file.txt") Dim line As String = reader.ReadLine() End Using Catch ex As IOException MsgBox("Ошибка: " & ex.Message) Finally ' Всегда выполняется End Try End Sub

Вопрос с подвохом.

Если в VB6 произойдет ошибка в блоке On Error Resume Next, как узнать, где именно она произошла, и как правильно её обработать?

Правильный ответ: В режиме On Error Resume Next программа продолжает выполнение на следующей строке. Чтобы узнать, произошла ли ошибка, нужно проверить объект Err по окончании вызова.

On Error Resume Next ' некоторый код If Err.Number <> 0 Then MsgBox "Ошибка: " & Err.Description Err.Clear End If

Примеры реальных ошибок из-за незнания тонкостей темы.


История

После перехода с VB6 на VB.NET часть обработчиков оставили в стиле On Error GoTo, что привело к неявному проглатыванию ошибок. Перепутали логику обработки, из-за чего данные в БД оставались полупустыми, а баг был обнаружен только спустя месяцы.


История

Не использовали Err.Clear, в результате после одной обработанной ошибки Err.Number оставался ненулевым. При дальнейших проверках программа ошибочно считала, что произошла новая ошибка, и уходила в неверные ветви обработки.


История

При рефакторинге забыли удалить On Error Resume Next, из-за чего ошибки "проглатывались" и не выдавали никаких сообщений. Диагностика проблем занимала часы, поскольку приложение выглядело, будто работает нормально, но фактически теряло важные данные.