2009-10-07 3 views
3

Я изучаю CSharp.I есть некоторые сомнения в обработке исключений.Индивидуально направьте меня, чтобы улучшить свои знания кодирования .catching exception-general сомнения

Пусть я построить сегмент кода:

try { 

     SomeWork(); 
     return success; 
    } 
    catch (someException ex) 
    { 
     throw new ExceptionDetails(ex); 
     return failure; 
    } 
    catch(AnotherException exp) 
    { 
     throw new ExceptionDetails(exp); 
     return failure; 
    } 
    finally 
    { 
     CleanUpStuff(); 
    } 

Вопросы:

(1) Могу ли я использовать обратный оператор после "броска" (бросание исключение)?

(2) Является ли исключение уродливой практикой? Когда мне нужно просто выбросить исключение? Нужно ли мне использовать «бросок», чтобы сообщать только о специальном исключении?

(3)

try 
    { 
     SomeWork(); 
    } 
    catch(StringIndexOutOfBound ex) 
    { 
     throw; 
    } 

с помощью анонимного заявления вбрасывания в улове является хорошей практикой?

ответ

3

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

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

3) Не делайте # 3, если вы не собираетесь делать что-либо еще с исключением. Если вы собираетесь регистрировать его или делать что-то значимое и все равно хотите перебросить исключение, используйте его «анонимно» (??), как вы там.

+0

Что касается № 2, исключения должны использоваться для ** ошибки ** условий, не исключительных обстоятельств. –

+0

Скотт, иногда вы достигаете ситуаций в своем коде, которые не являются технически ошибками, но являются нежелательными или безотзывными условиями. В этих случаях необходимо исключать исключения - они не являются ошибками, а являются обстоятельствами, которые являются исключением. Примеры: проверки проверки параметров, проверки нулей, проверки длины строк, проверки валидации кредитной карты. Это не технические ошибки - это просто обстоятельства, при которых вы не можете использовать код для исправления ситуации. – rein

3

Подсказка: ничего после броска никогда не будет выполнено. Компилятор должен сказать вам это!

+1

Это также зависит от того, почему вы регистрируетесь, мы используем TraceListener и Trace.WriteLine для ведения журнала ошибок (поскольку наша система является удаленной системой в реальном времени, поэтому наши операторы хотят видеть, какие ошибки возникают). Я предполагаю, что я пытаюсь сказать, это исключение только анонимных исключений, если вы не можете справиться с исключением на более низком уровне. Кроме того, по совершенно другой теме, если вы не собираетесь использовать исключение, которое вы поймаете, нет смысла его именовать. catch (Exception) будет работать так же хорошо, как catch (Exception ex), если вы не собираетесь использовать ex –

1

Что вы делаете исключение, ваш оператор возврата не будет работать.

Попробуйте поймать конкретное исключение и обработать его там, а также вернуть значение после блока finally.

бросок экс

сбросит трассировки стека до точки броска.

бросок

сохранит первоначальный стек, который будет полезен при отладке.

+0

У вас есть «бросок» и «выброс ex» назад. 'throw' будет поддерживать исходную трассировку стека, в то время как' throw ex' нарушит ее. –

1

1) Наличие инструкции возврата после выброшенного исключения не будет компилироваться, и вы должны получить предупреждение о недостижимом коде.

2) Бросок исключения совершенно правдоподобен, это потенциально допускает появление более общей обработки ошибок. например

public void readFile() 
{ 
    try 
    { 
     // Perform IO action 
    } 
    catch (FileNotFoundException ex) 
    { 
     // Perform error recovery e.g. create a default file 
    } 
    catch (Exception ex) 
    { 
     // Cant perform any error recovery at this level so throw the exception to allow the calling code to deal with it 
     throw; 
    } 
} 

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

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

3) Как уже упоминалось в другом месте сообщения, как правило, неплохо не просто «выбросить» исключение, поскольку иметь информацию о том, как и где оно произошло, часто очень полезно при отладке.

+1

Пожалуйста, измените ваш бросок ex; бросать; – rein

+0

Почему необходимо изменить код snippit? –

+1

Ну, во-первых, вы не должны «выполнять обработку ошибок везде, где сможете». Вы должны выполнять обработку ошибок только там, где хотите что-то сделать с ошибкой. Ваш фрагмент кода не должен перехватывать исключение, потому что вы ничего не делаете с ним. Вы правильно делаете что-то с FileNotFoundException. Кроме того, если вы отмените исключение, вы никогда не должны бросать его, используя «throw ex». Изменение фрагмента кода сделает ваш ответ более правильным. – rein