Không ai giải thích được sự khác biệt giữa ExceptionDispatchInfo.Capture( ex ).Throw()
và đồng bằng throw
, vì vậy đây là.
Cách hoàn chỉnh để lấy lại một ngoại lệ bị bắt là sử dụng ExceptionDispatchInfo.Capture( ex ).Throw()
(chỉ có sẵn từ .Net 4.5).
Dưới đây là các trường hợp cần thiết để kiểm tra điều này:
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 );
}
}
Trường hợp 1 và trường hợp 2 sẽ cung cấp cho bạn một dấu vết ngăn xếp trong đó số dòng mã nguồn cho CallingMethod
phương thức là số dòng củathrow new Exception( "TEST" )
dòng.
Tuy nhiên, trường hợp 3 sẽ cung cấp cho bạn một dấu vết ngăn xếp trong đó số dòng mã nguồn cho CallingMethod
phương thức là số dòng của throw
cuộc gọi. Điều này có nghĩa là nếu throw new Exception( "TEST" )
dòng được bao quanh bởi các hoạt động khác, bạn không biết số dòng nào thực sự bị ném.
Trường hợp 4 tương tự với trường hợp 2 vì số dòng của ngoại lệ ban đầu được giữ nguyên, nhưng không phải là một suy nghĩ thực sự vì nó thay đổi loại ngoại lệ ban đầu.