Страницы

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

суббота, 1 февраля 2020 г.

разница в throw, throw new, throw ex

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


В чем все таки разница и зачем вообще бросать исключение?
Я так понимаю если у нас в где-то вызывается метод в котором потенциально может быть
ошибка мы должны от туда "бросать" исключение в место от куда метод не посредственно
вызывается,
    


Ответы

Ответ 1



Если совсем упрощать, то есть всего две конструкции, throw e и throw. Первая - throw e - берет объект исключения и бросает его. Этот объект поймает первый соответствующий catch выше по стеку. В момент бросания к исключению привязывается стек вызовов, от того места, где был вызван throw e и выше. Поймав этот e выше, вы можете узнать точное место, где был вызван throw e. Вторая - throw - может использоваться только в catch, и она пробрасывает пойманное этим catch исключение выше так, как будто вы его не поймали. Простой пример private static void B() { throw new Exception(); } private static void A() { try { B(); } catch (Exception e) { throw; } } public static void Main(string[] args) { try { A(); } catch (Exception e) { Console.WriteLine(e); } } Метод A ловит исключение, но делает вид что не поймал (вызывает throw). Поэтому на консоль выводится System.Exception: Exception of type 'System.Exception' was thrown. at ConsoleApp13.Program.B() in ... at ConsoleApp13.Program.A() in ... at ConsoleApp13.Program.Main(String[] args) in ... Если же метод A переписать как private static void A() { try { B(); } catch (Exception e) { throw e; } } То информация о том, что исключение было создано и брошено в B, потеряется: System.Exception: Exception of type 'System.Exception' was thrown. at ConsoleApp13.Program.A() in at ConsoleApp13.Program.Main(String[] args) in То поведение будет таким же, как если бы в A было написано просто throw new Exception();

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

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