Что входит в () улова? - PullRequest
1 голос
/ 20 декабря 2011

Я использую следующий код:

catch (Exception ex) { 
    processException(ex); 
    return View("CreateEdit", vm); 
}

Необходимо ли объявлять исключение "Exception ex".Мне интересно, есть ли в блоке catch в скобках что-нибудь, что не связано с чем-то, полученным из исключения?

Ответы [ 4 ]

2 голосов
/ 20 декабря 2011

Нет; это всегда должен быть аргумент типа Exception или что-то производное от него.

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

try
{
    //stuff...
}
catch (DivideByZeroException ex)
{
   //do stuff with divide by zero...
}
catch (MyCustomException ex)
{
   //do stuff with my custom exception...
}
catch (IOException ex)
{
   //do stuff with IO Exception...
}
catch (Exception ex)
{
   //handle all other exceptions
}

Порядок пунктов catch жизненно важен, если их несколько. Они должны всегда идти от самого производного к наименьшему; Если бы я поместил последний блок Exception сверху, он перехватил бы все исключения, а другие, более производные блоки ничего не поймали бы.

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

2 голосов
/ 20 декабря 2011

В C #, когда вы ловите что-то определенного типа, это должен быть Exception или тип, полученный из Exception. Другие языки .NET (например, C ++ / CLI) поддерживают выбрасывание не Exception типов, и единственный способ поймать их - использовать «пустой улов», то есть catch { ... } - но это полезно только в очень редких случаях (в основном при взаимодействии с другими библиотеками).

2 голосов
/ 20 декабря 2011

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

Лучше не ловить исключения типа Exception напрямую, а ловить конкретные исключения. Блок перехвата, который обрабатывает System.Exception (если присутствует), лучше всего указывать последним.

http://msdn.microsoft.com/en-us/library/ms229007.aspx

http://msdn.microsoft.com/en-us/library/system.exception.aspx

1 голос
/ 20 декабря 2011

Нет, это не обязательно.В блоке catch вы объявляете объект класса System.Exception, в котором содержатся подробности вызванного исключения.

Вы можете объявить, как хотите, так как это просто соглашение, использующее Exception Ex.Класс в скобках - это тип пойманного исключения.Если вы не используете круглые скобки, вы должны выбросить исключение, используя оператор throw.

Например, все они действительны:

catch (Exception ex) { }
catch (Exception e ) { }
catch (Exception objEx) { }
...