В чем все таки разница и зачем вообще бросать исключение? Я так понимаю если у нас в где-то вызывается метод в котором потенциально может быть ошибка мы должны от туда "бросать" исключение в место от куда метод не посредственно вызывается,
Если совсем упрощать, то есть всего две конструкции, 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();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно узнать альтернативы к ConsoleClear(); и к Environment
В Windows Form есть textboxНадо что бы каждую секунду текст из файла размещался в textbox
Тут заметил, случайно, если мы попытаемся в своем приложении запустить командную строку с любыми параметрамиТо откроется только окошко CMD