Как убрать обработку ошибок в функции? - PullRequest
3 голосов
/ 13 февраля 2012

Я смотрю на код, написанный кем-то другим.

Некоторые из больших функций - беспорядок, с изменениями в обработке ошибок во многих точках всей функции. Существует множество On Error Goto ErrHandler, On Error Goto 0, On Error Resume Next, когда вы проходите через функцию.

Как лучше всего обработать и исправить эту ошибку, чтобы в верхней части функции был только один On Error Goto ErrHandler, как и должно быть?

Ответы [ 2 ]

6 голосов
/ 13 февраля 2012

Я не думаю, что наличие единственного обработчика ошибок обязательно является лучшим решением.

Если у вас есть огромная функция с одним обработчиком ошибок и что-то идет не так, вы не представляете, в какой момент она потерпела неудачу.

Звучит так, как будто описанные вами функции имеют правильную обработку ошибок, но это не значит, что их легко читать.

Возможно, лучшим решением будет перефакторизовать больших функций на несколько меньших, которые могут иметь свой собственный обработчик единой ошибки, поэтому при возникновении ошибки у вас есть всего несколько строк, чтобы отследить ошибку

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

3 голосов
/ 13 февраля 2012

Трудно сказать, не глядя на рассматриваемый код, но бывают случаи, когда допустимо несколько различных типов обработки ошибок в одной функции. В общем, один On Error GoTo ErrHandler в верхней части функции выполняет ту же функцию, что и включающий блок try/catch в языке, который поддерживает исключения - он предназначен для обнаружения неожиданных ошибок, которые происходят.

Тем не менее, внутри функции могут быть места, где ошибка является нормальным, ожидаемым событием, которое вы хотите проверить на наличие inline. Например, предположим, что вы собираетесь получить доступ к сетевому диску, где вы должны учитывать, что удаленный сервер находится в автономном режиме, сеть отключена и т. Д. В этом случае, даже если в верхней части есть оператор On Error GoTo ErrHandler, вы можете включить это локально с On Error Resume Next и попробуйте получить доступ к диску. Если происходит ошибка, VB6 теперь просто перейдет к следующему оператору, где вы можете проверить Err.Number на наличие чего-либо, кроме 0. Это аналог вложенного try/catch для перехвата ожидаемого состояния ошибки, которое вы можете обработать локально. После того, как выполнение вышло за пределы рискованного кода, вы должны отметить конец раздела, где вы собираетесь «вручную» проверять ошибки таким образом, с помощью другого оператора On Error GoTo ErrHandler, чтобы снова включить функцию многоуровневый обработчик.

Так что есть случай, когда допустимо более одного On Error... статуса. Можно привести аргумент, что рискованная функция должна быть подвергнута рефакторингу и иметь собственный обработчик, но вам все равно придется иметь дело с конкретными (ожидаемыми) возвращаемыми значениями ошибок из этой отдельной функции, потому что называется Функция, вероятно, не будет знать, что делать перед лицом этих ошибок в контексте , вызывающей функцию. Вы бы все равно справились с этим с помощью краткосрочной техники On Error Resume Next.

On Error GoTo 0 отключает все обработку ошибок, позволяя VB6 выходить из функции при возникновении непредвиденной ошибки. Мне трудно придумать не надуманную ситуацию, когда это было бы хорошим вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...