Начиная с .NET Framework 4.5, вы можете использовать класс ExceptionDispatchInfo
, чтобы сделать это без необходимости использования другого метода.Например, заимствуя код из превосходного ответа Ганса, когда вы просто используете throw
, например:
using System;
class Program {
static void Main(string[] args) {
try {
Test();
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
static void Test() {
try {
throw new ArgumentException(); // Line 15
}
catch {
throw; // Line 18
}
}
}
, выводится следующее:
System.ArgumentException: Value does not fall within the expected range.
at Program.Test() in Program.cs:line 18
at Program.Main(String[] args) in Program.cs:line 6
Но вы можете использоватьExceptionDispatchInfo
для захвата и повторного выброса исключения, например:
using System;
class Program {
static void Main(string[] args) {
try {
Test();
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
static void Test() {
try {
throw new ArgumentException(); // Line 15
}
catch(Exception ex) {
ExceptionDispatchInfo.Capture(ex).Throw(); // Line 18
}
}
}
Затем будет выведено следующее:
System.ArgumentException: Value does not fall within the expected range.
at Program.Test() in Program.cs:line 15
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Program.Test() in Program.cs:line 18
at Program.Main(String[] args) in Program.cs:line 6
Как видите, ExceptionDispatchInfo.Throw
добавляет дополнительную информациюк трассировке стека исходного исключения, добавив тот факт, что оно было переброшено, но оно сохраняет исходный номер строки и тип исключения.Для получения дополнительной информации см. Документацию MSDN .