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

113
06 сентября 2021, 14:00

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

Answer 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();

READ ALSO
Альтернативы к Console.Clear(); и к Environment.Exit(0); в C#

Альтернативы к Console.Clear(); и к Environment.Exit(0); в C#

Нужно узнать альтернативы к ConsoleClear(); и к Environment

159
В Windows Form ежесекундно выводить текстовое сообщение из файла

В Windows Form ежесекундно выводить текстовое сообщение из файла

В Windows Form есть textboxНадо что бы каждую секунду текст из файла размещался в textbox

149
Нельзя в командную строку передать параметры

Нельзя в командную строку передать параметры

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

79