Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Разница между catch, catch(Exception) и catch(Exception ex)

#c_sharp #исключения #try_catch #c_sharp_faq


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

try
{
    ...
}
catch(Exception ex)
{
    return;
}


Надо ли в таком случае объявлять переменную ex?

Или можно сделать так:

try
{
    ...
}
catch(Exception)
{
    return;
}


Или вообще вот так:

try
{
    ...
}
catch
{
    return;
}


В чем разница и как правильнее?
    


Ответы

Ответ 1



Переменную нужно объявлять, если в дальнейшем планируется её как-то использовать. Если важен только сам факт перехвата - достаточно указать всего лишь тип. Различие в catch(Exception) и пустом catch имеет место быть, если нужно перехватывать не CLS-совместимые исключения. Более подробнее об этом можно почитать на msdn. По ссылке как раз видно, что есть смысл и в таком коде: catch(Exception) { ... } catch { ... }

Ответ 2



Исключения также можно выстраивать одно за другим по мере увеличения. Если error не поппадает ни в одно исключений, то обезательно попадет в catch (Exception ex) как показанно на примере ниже. finally блок выполняется в при любых условиях. Console.WriteLine("Enter a number:"); while (true) { try { int yourNum = Convert.ToInt32(Console.ReadLine()); if (yourNum < 1 || yourNum > 10) { throw new Exception("Number must be between 1 and 10"); } Console.WriteLine("Your number is {0} !", yourNum); break; } // ловит ошибку неправильного формата. catch (FormatException) { Console.WriteLine("Not a number. Please try again"); } // ловит ошибку если число не попадает в допусимый ряд int catch (OverflowException) { Console.WriteLine("Not a valid integer. Pelase try again"); } // если ни один из предыдущих catch не скработал ловим изящно (gracefully) в ex переменную где ex.ToString() выводит нам на экран в string формате catch (Exception ex) { Console.WriteLine(ex.ToString()); } // код выполняется независимо есть ли ошибка или нет. finally { Console.WriteLine("Thanks for playing!"); } }

Ответ 3



Если вы хотите отловить любое исключение и контекст не важен, пишите: try { //... } catch { //... } Если важен тип исключения то: try { //... } catch (Exception) { //... } Но если логика завязана ещё и на данных в классе исключения то соответственно: try { //... } catch (Exception ex) { //... }

Ответ 4



1) Ловим конкретный тип исключения и заносим его в переменную. Переменную можно проанализировать в блоке и ,например, попробовать восстановить правильный ход программы 2) Ловим конкретный тип исключения, но само исключение не анализируем 3) Не уверен, но скорее всего ловятся абсолютно все исключения. P.S Так как все исключения наследуются от Exception, то 2 и 3 примеры аналогичны.

Комментариев нет:

Отправить комментарий