В чем все таки разница и зачем вообще бросать исключение? Я так понимаю если у нас в где-то вызывается метод в котором потенциально может быть ошибка мы должны от туда "бросать" исключение в место от куда метод не посредственно вызывается,
Если совсем упрощать, то есть всего две конструкции, 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();
Сборка персонального компьютера от Artline: умный выбор для современных пользователей