Нет, ваше понимание того, как работает бросание и повторное бросание, неверно.
Когда вы генерируете исключение, вы теряете всю информацию трассировки стека о том, что произошло до недавно созданного исключения. Проблема в том, что у вас весь код в одних и тех же файлах, и у вас возникают проблемы с чтением и корректным сравнением информации в каждой трассировке стека.
Создайте следующий код, убедившись, что каждый класс находится в разных .cs файл. Запустите его и сравните обе напечатанные трассировки стека, и вы увидите, что метание теряет информацию:
//Foo.cs
public class Foo
{
public void Crash() => throw new Exception();
}
//Blah.cs
public class Blah
{
public void CrashAndThrow()
{
var foo = new Foo();
try
{
foo.Crash();
}
catch (Exception ex)
{
throw ex;
}
}
public void CrashAndReThrow()
{
var foo = new Foo();
try
{
foo.Crash();
}
catch
{
throw;
}
}
}
//Program.cs
class Program
{
static void Main(string[] args)
{
var bla = new Blah();
try
{
bla.CrashAndThrow();
}
catch (Exception ex)
{
Console.WriteLine("Throw:");
Console.WriteLine(ex.StackTrace);
Console.WriteLine();
}
try
{
bla.CrashAndReThrow();
}
catch (Exception ex)
{
Console.WriteLine("Rethrow:");
Console.WriteLine(ex.StackTrace);
}
Console.ReadLine();
}
}
Вывод этой программы на моем компьютере:
Throw:
at SOStuff.Alpha.Blah.CrashAndThrow() in ...\SOStuff\Blah.cs:line 16
at SOStuff.Program.Main(String[] args) in ...\SOStuff\Program.cs:line 13
Rethrow:
at SOStuff.Alpha.Foo.Crash() in ...\SOStuff\Foo.cs:line 7
at SOStuff.Alpha.Blah.CrashAndReThrow() in ...\SOStuff\Blah.cs:line 24
at SOStuff.Program.Main(String[] args) in ...\SOStuff\Program.cs:line 24
Как вы можете видеть , когда вы бросаете, вся информация об оригинальном исключении, брошенном в Foo
, теряется.
Общие правила, которые я применяю:
- Если вы не можете с этим справиться, дона не поймайте его
- Если вы не можете справиться с этим, но вам нужно поймать его, чтобы очистить, записать информацию или что-то еще, выбросить его.
- Если вы не можете справиться с этим, но нельзя допустить, чтобы чувствительная или не относящаяся к делу информация в исключении достигла потребителя, а затем выбросить новую с достаточным количеством информации, которая позволит впоследствии исправить ошибки.
- Если вы можете обработать ее, то обработайте ее .
99% времени, я применяю правило № 1.