2009-07-14 3 views
0

Я видел код, как это (на самом деле видим другой человек типа его):Странная исключение

catch (Exception ex) 
{ 
    string exception = ex.ToString(); 
} 

Является ли этот код плохо? Если да, то почему? Существует соответствующая «цепочка обработчиков улов» (например, более конкретная выше, отфильтровывается до общего catch all Exception, но в преобразовании строки Exception, я думаю, вы конвертируете намного больше, чем это возможно, в строку (Все, что вам действительно нужно, это InnerMessage или одно из других свойств строки в зависимости от сценария). Что-то еще не так с этим кодом?

Я также видел, как разработчики помещали точки останова на каждую строку кода. это? Почему бы не просто положить один на вершине, а затем использовать «бежать к курсору» (любовь, которая имеется)?

Наконец, в чем преимущество использования перерыва на все исключения в Visual Studio?

+3

Я думаю, что ваш фрагмент - очень хороший пример запаха кода. – jon37

+0

Спасибо за помощь. – dotnetdev

ответ

2

Этот разработчик может не знать, что вы можете поймать все (управляемый) исключения, как это ...

try 
{ 
    // do something 
} 
catch(Exception) 
{ 

} 

И не постигнет предупреждение компилятора улова блока, как это ...

catch(Exception ex) 
{ 
    // don't use ex 
} 

Кроме того, он не мог знать о $exception pseudo-register.

+0

Ну, мальчик, но я тоже. Спасибо за это. –

+0

На самом деле вам нужно только 'catch {}'. – jasonh

2

Единственное значение введенного вами кода будет заключаться в том, чтобы исключить полное исключение во время отладки. Это не необходимо, так как отладчик все равно это сделает, но, возможно, этот код был там до того, как отладчик сделал это.

+0

Я видел этот точный код, поскольку он записывается за последние несколько недель lol (Visual Studio 2008 Professional Edition/.NET 2.0/3.5). – dotnetdev

3
string exception = ex.ToString(); 

Это не делает ничего. Лучше зарегистрировать его или использовать MessageBox.Show (...) ;.

Breakpoints на каждой линии ... нет особого смысла - использование запустить до курсора или перешагнуть/шаг в

Перерыв на всех исключениях: Я на самом деле использовали.. У меня были исключения, которые терпели неудачу, которые были «обработаны» какой-то библиотекой молча. Перерыв на всех помог мне отследить это. Кроме того, «Break on all» может помочь вам удостовериться, что вы получаете только исключения, которые вы ожидаете (также помогли не поймать общий класс «Исключение», но только поймать конкретное исключение.

+0

Я не уверен в этом, но я подозреваю, что эта линия даже будет оптимизирована компилятором в режиме Release. – Noldorin

+1

Кроме того, я думаю, Visual Studio даст предупреждение о том, что у вас есть строка, которая назначена, но никогда не используется. – McAden

+0

Нет, если он ловко добавил #pragma warning disable 0169;) – Keltex

3

Это выглядит как ленивый программист, который:

  1. не хочет обрабатывать исключения правильно
  2. хочет место, чтобы установить контрольную точку, если есть исключение.
+2

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

+0

Нет, нет политики или автоматического соблюдения правил. – dotnetdev

0

Я только что использовал «перерыв на все исключения» вчера.

Я преследовал довольно неясную ошибку (на самом деле код работал отлично, что является самым сложным из всех ошибок), и хотя мой код C# выполнял явно неработающий скрипт IronPython, я продолжал получать сообщения ArgumentException, появляющиеся в консоли.

Оказывается, что это IronPython код:

try: 
    value += x 
except ValueError: 
    pass 

приводит к ArgumentException бросают, и обрабатываются внутри выполнения IronPython.

Кроме того, если вы включили «break on all exceptions», VS фактически разрывается на этой линии value += x, вызывает источник Python, позволяет проверять локальные значения и т. Д. Довольно приятно. В любом случае, теперь, когда я вижу, что эти сообщения об исключениях появляются в консоли, я больше не беспокоюсь о том, что я игнорирую то, что меня укусит.