2015-07-18 2 views
0

Вот код structre:Как определить, откуда произошло исключение?

try 
    { 
     --outter code block; 

     try 
     { 
      --inner code block; 
     } 

     catch(Exeption ex) 
     { 
      throw new Exception() 
      --inner catch block 
     } 
    } 
    catch(Exeption ex) 
    { 
     --outter catch block 
    }  

Как я могу определить, поймать блок Outter если исключение генерируется в блоке кода Outter или во внутреннем бросили блока поймать?

+0

У вас действительно есть код с 'catch (Exeption ex)' в качестве обработчиков исключений? Вы не должны этого делать. Это так же плохо, как использование 'goto'. – Enigmativity

ответ

3

Способ, которым вы управляете этим, является внутренним кодом кода, который должен включать выполнение в свой параметр innerException, если вы планируете бросать новое исключение или просто использовать throw;, чтобы исключить появление пузырьков.

try 
{ 
    //outter code block; 

    try 
    { 
     //inner code block; 
    } 

    catch(Exeption ex) 
    { 
     throw new MySpecialException("Some Extra Information", ex); 
     // or 
     throw; 
    } 
} 
catch(Exeption ex) 
{ 
    //ex.InnerException contains the "ex" from up above if you used MySpecialException 
    // or ex will be the same exception with the same stack trace if you used throw; 
} 

Обратите внимание, что считается очень плохой практикой, чтобы сделать throw new Exception вы всегда должны бросать некоторое более производное исключение или your own user exception и это исключение вы бросаете следует добавить новую порцию информации. Если вам не нужно создавать новое исключение, чтобы добавить дополнительную информацию, просто используйте throw;

1

Выбрасывать исключения из разных типов или передавать различные строковые аргументы конструктору.

+0

Действительно, с соответствующими, разными типами, в этом блоке не нужен такой код. –

+0

Вы хотите проверить внешний блок catch, если «ex.message» имеет строку? – Michael

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