2016-08-18 4 views
2

Каковы наилучшие методы выбора между throw; и throw ex;? Есть ли вообще? Что касается -для ПРИМЕР- этого простого фрагмента коды:Как исключить исключение

try{ 
    // some code 
} catch (Exception ex) { 
    // some catcher code 
    // throw; ? 
    // or 
    // throw ex; ? 
    // how to decide which one? 
} 

UPDATE: Я знаю разницу между выше буксиром. Вопрос в том, как решить использовать один из них? Есть ли лучшая практика для лучшего выбора?

+2

Используйте 'throw', это сохраняет исходный стек. Но почему вы вообще поймаете общее исключение? Кажется, вы не можете справиться с этим, так зачем его поймать? – Maarten

+0

@Maarten это случалось бы иногда. Повторная попытка некоторых операций, например –

+0

Возможная дубликация [Есть ли разница между «броском» и «броском»?] (http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw -and-throw-ex) – Sinatr

ответ

1

Это очень 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 - аналог - некоторая информация скрыта, но, возможно, вы хотите скрыть ее, кто знает?

8

Вы должны либо использовать throw;, чтобы повторно выбрасывать исходное исключение (с исходной трассировкой стека), либо использовать throw new MyException(..., ex);, чтобы создать собственное исключение, которое может предоставить дополнительную информацию и установить внутреннее исключение ex.

Если у вас нет какой-либо дополнительной информации просто используйте throw;

Если вы только поймать исключение делать очистку, а затем использовать try {...} finally {...} вместо этого.

Смежные вопросы