В 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, из-за чего ошибки "проглатывались" и не выдавали никаких сообщений. Диагностика проблем занимала часы, поскольку приложение выглядело, будто работает нормально, но фактически теряло важные данные.