Try и catch не выходят из программы, они просто контролируют поток кода на случай, если произойдет что-то исключительное.
Когда в блоке try происходит исключение, выполнение продолжается в первой строке(соответствующий) блок catch.После выполнения блока catch код продолжается в первой строке после перехвата, который в вашем случае может быть End While
, который продолжит цикл.
Таким образом, такая конструкция
While dr.Read
Try
InsertRowIntoDataBase()
Catch ex As Exception
LogErrorToFile(ex)
End Try
End While
должно работать для вас.
Однако это плохой дизайн, поскольку он будет генерировать и регистрировать исключение, независимо от того, в чем заключается проблема, являются ли данные недействительными, или сервер sql не работает, или даже еслив вашем коде есть ошибка (например, скрывается исключение NullReferenceException).Вы должны ограничить обработку исключений конкретным случаем, например, проблемой с базой данных, например:
While dr.Read
Try
InsertRowIntoDataBase()
Catch ex As SqlClient.SqlException
LogDataBaseErrorToFile(ex)
End Try
End While
Также, если есть известные возможные проблемы с данными (например, строка в CSVгде ожидается целое число) лучше просто проверить это, чем использовать механизм исключения, что-то вроде этого:
While dr.Read
Try
If Not IsRowValid() Then
LogInvalidDataToFile()
Continue While
End If
InsertRowIntoDataBase()
Catch ex As SqlClient.SqlException
LogDataBaseErrorToFile()
Catch ex As Exception
LogGenericErrorToFile()
End Try
End While