Трудно сказать, не глядя на код, о котором идет речь, но бывают случаи, когда несколько разных типов обработки ошибок в одной функции являются законными. В общем, один On Error GoTo ErrHandler
в верхней части функции выполняет ту же функцию, что и закрытый блок try/catch
на языке, который поддерживает исключения - он должен поймать неожиданные ошибки, которые возникают.
Однако в пределах функции могут быть места, где ошибка является нормальным ожидаемым появлением, которое вы хотите проверить для встроенного. Например, скажем, что вы переходите к сетевому диску, где вам приходится учитывать, что удаленный сервер находится в автономном режиме, сеть выключена и т. Д. В этом случае, хотя в верхней строке есть инструкция On Error GoTo ErrHandler
, вы можете отключить это локально с On Error Resume Next
и попытайтесь получить доступ к диску. Если возникла ошибка, VB6 теперь просто перейдет к следующему оператору, где вы можете проверить Err.Number
на что угодно, кроме 0. Это аналогично вложенному try/catch
, чтобы уловить ожидаемое условие ошибки, которое вы можете обрабатывать локально. После того, как выполнение перешло за пределы рискованного кода, вы должны пометить конец раздела, в котором вы собираетесь «вручную» проверить ошибки таким образом, с помощью другогоOn Error GoTo ErrHandler
инструкции для повторного включения обработчика уровня функции.
Таким образом, есть случай, когда более одного счета On Error...
. Аргумент может заключаться в том, что рисковая функция должна быть реорганизована и иметь собственный обработчик, но вам все равно придется иметь дело с конкретными (ожидаемыми) значениями возврата ошибки из этой отдельной функции, поскольку функция , называемая, вероятно, t знать, что делать перед лицом этих ошибок в контексте функции , вызывающей. Вы по-прежнему будете обрабатывать это с помощью краткосрочной техники On Error Resume Next
.
On Error GoTo 0
disable все обработка ошибок, позволяющая VB6 освобождаться от вашей функции всякий раз, когда возникает непредвиденная ошибка.Мне трудно найти подходящую ситуацию, когда это было бы неплохо.
Я не думаю, что правильно выбрать смесь «On Error Goto 0», «On Error Resume Next» и «On Error Goto ErrHandler» в одной функции. – CJ7
+1 для рефакторинга. Если кусок кода нуждается в собственном обращении с ошибками, что он, вероятно, будет отдельной логикой. – Dabblernl
+1. Это может быть правильным (даже существенным), чтобы иметь смесь 'On Error Goto 0',' On Error Resume Next' и 'On Error Goto ErrHandler'. Особенно, если вы отключите обработку ошибок при выполнении в VB6 IDE, используя что-то вроде ссылки CraigJ, размещенной на [этот вопрос] (http://stackoverflow.com/questions/9206930/mouse-wheel-support-for-grid- в-vb6-приложение). Но это может запутаться в долгой функции. Рефакторинг в более мелкие подпрограммы - хороший подход, когда любая большая процедура становится слишком сложной и громоздкой. – MarkJ