2012-02-13 2 views
3

Я смотрю код, написанный кем-то другим.Как очистить обработку ошибок в функции?

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

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

ответ

6

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

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

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

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

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

+0

Я не думаю, что правильно выбрать смесь «On Error Goto 0», «On Error Resume Next» и «On Error Goto ErrHandler» в одной функции. – CJ7

+2

+1 для рефакторинга. Если кусок кода нуждается в собственном обращении с ошибками, что он, вероятно, будет отдельной логикой. – Dabblernl

+1

+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

3

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

+0

Я согласен со всем, кроме вашего последнего раздела. Я бы предпочел, чтобы «On Error Goto 0» случайно оставил «On Error Resume Next» включенным, когда этого не должно быть. Больше повреждений можно сделать, молча игнорируя ошибки. Ошибка, которую вы видите, - это ошибка, которую вы можете исправить :) – tcarvin

+1

Используйте 'On Error GoTo 0' перед« Err.Raise ... »для повышения пользовательских ошибок из метода. – wqw

+0

@tcarvin True. Когда я (раньше) писал VB6, я бы написал «On Error Resume Next», затем «On Error Goto Handler» и * then * вернитесь и заполните код между ними, чтобы избежать этой проблемы. – JeffK

Смежные вопросы