Ninguém explicou a diferença entre ExceptionDispatchInfo.Capture( ex ).Throw()
e uma planície throw
, então aqui está.
A maneira completa de reconfigurar uma exceção capturada é usar ExceptionDispatchInfo.Capture( ex ).Throw()
(disponível apenas no .Net 4.5).
Abaixo há os casos necessários para testar isso:
1
void CallingMethod()
{
//try
{
throw new Exception( "TEST" );
}
//catch
{
// throw;
}
}
2)
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
ExceptionDispatchInfo.Capture( ex ).Throw();
throw; // So the compiler doesn't complain about methods which don't either return or throw.
}
}
3)
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch
{
throw;
}
}
4)
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
throw new Exception( "RETHROW", ex );
}
}
O caso 1 e o caso 2 fornecerão um rastreamento de pilha em que o número da linha do código-fonte do CallingMethod
método é o número da throw new Exception( "TEST" )
linha.
No entanto, o caso 3 fornecerá um rastreamento de pilha em que o número da linha do código-fonte do CallingMethod
método é o número da linha da throw
chamada. Isso significa que, se a throw new Exception( "TEST" )
linha estiver cercada por outras operações, você não terá idéia de qual número de linha a exceção foi realmente lançada.
O caso 4 é semelhante ao caso 2, porque o número da linha da exceção original é preservado, mas não é uma releitura real, pois altera o tipo da exceção original.