Это очень simple.
Вы хотите сохранить трассировку стека, чтобы увидеть, где именно происходит исключение? Затем используйте throw
, это будет похоже на то, что вы вообще не используете catch
.
Вас интересует только Текущий метод отладочная информация? Затем throw ex
.
Чтобы продемонстрировать:
static void Main(string[] args)
{
try
{
Test();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
static void Test()
{
try
{
// long lambda chain
new Action(() => new Action(() => new Action(() => { throw new InvalidOperationException(); })())())();
}
catch (Exception ex)
{
//throw;
//throw ex;
}
}
throw
будет держать трассировки стека:
System.InvalidOperationException: Operation is not valid due to the current state of the object.
at ConsoleApplication.Program.<>c.<Test>b__1_2() in ConsoleApplication\Program.cs:line 22
at ConsoleApplication.Program.<>c.<Test>b__1_1() in ConsoleApplication\Program.cs:line 22
at ConsoleApplication.Program.<>c.<Test>b__1_0() in ConsoleApplication\Program.cs:line 22
at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 26
at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13
throw ex
сбросит трассировки стека:
System.InvalidOperationException: Operation is not valid due to the current state of the object.
at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 27
at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13
Что касается лучших практик - выбор обычно throw
, как разработчик, вы хотите получить как можно больше информации, throw ex
- аналог - некоторая информация скрыта, но, возможно, вы хотите скрыть ее, кто знает?
Используйте 'throw', это сохраняет исходный стек. Но почему вы вообще поймаете общее исключение? Кажется, вы не можете справиться с этим, так зачем его поймать? – Maarten
@Maarten это случалось бы иногда. Повторная попытка некоторых операций, например –
Возможная дубликация [Есть ли разница между «броском» и «броском»?] (http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw -and-throw-ex) – Sinatr