Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-在不丢失堆栈跟踪和内部异常的情况下创建新异常?_C#_Exception - Fatal编程技术网

C#-在不丢失堆栈跟踪和内部异常的情况下创建新异常?

C#-在不丢失堆栈跟踪和内部异常的情况下创建新异常?,c#,exception,C#,Exception,我有一个提供异常对象的方法,如果错误处理程序本身发生任何事情,我想记录一个错误。下面是一些伪代码: public override void OnError(Exception originalException) { try { // Do work... } catch (Exception e) { // How do I create this exception without losing the stack

我有一个提供异常对象的方法,如果错误处理程序本身发生任何事情,我想记录一个错误。下面是一些伪代码:

public override void OnError(Exception originalException)
{
    try
    {
        // Do work...
    }
    catch (Exception e)
    {
        // How do I create this exception without losing the stack 
        // trace of e and preserving any inner exceptions that were 
        // in e at the same time including the details of 
        // originalException?
        Exception newException = new Exception(e.Message, originalException);
        Logger.Error("An error occurred", newException);
    }
}
基本上,我试图将上面的originalException和e组合成一条异常消息,传递给logger对象。我想一个选项是创建两个单独的日志消息,但这并不理想。

您可以使用一个来包装多个异常:

public override void OnError(Exception originalException)
{
    try
    {
        // Do work...
    }
    catch (Exception e)
    {
        var exs = new AggregateException(originalException, e);
        Logger.Error("An error occurred", exs);
    }
}
编辑:如果
Logger
未记录
InnerException
属性的内容(或在本例中为
InnerExceptions
),则唯一的选项似乎是对
Logger的多次调用。错误

您可以使用包装多个异常:

public override void OnError(Exception originalException)
{
    try
    {
        // Do work...
    }
    catch (Exception e)
    {
        var exs = new AggregateException(originalException, e);
        Logger.Error("An error occurred", exs);
    }
}

编辑:如果
Logger
没有记录
InnerException
属性的内容(或者在本例中是
InnerExceptions
),那么唯一的选择似乎是多次调用
Logger.Error

,那么为什么不只记录原始异常。。。??那么就不需要创建新的异常。我还想记录错误筛选器本身中发生的情况。可以通过
newException
InnerException
属性访问
originalException
——您可以查看
InnerException
的堆栈跟踪。否则,您唯一的选择就是重新抛出原始异常:
尝试{…}catch(ex){Logger.Error(ex);throw;}
重新抛出您可以执行的
throw您不应该捕获这么多嵌套异常。您的代码应该在可能发生特定(而非一般)异常(如文件IO异常)和您可以处理的点处处理这些异常。然后,如果您想要一个catch-all异常处理程序,请在代码的顶层放置一个异常处理程序。否则,所有这些常规异常处理程序只会导致代码出现错误。那么为什么不只处理原始异常。。。??那么就不需要创建新的异常。我还想记录错误筛选器本身中发生的情况。可以通过
newException
InnerException
属性访问
originalException
——您可以查看
InnerException
的堆栈跟踪。否则,您唯一的选择就是重新抛出原始异常:
尝试{…}catch(ex){Logger.Error(ex);throw;}
重新抛出您可以执行的
throw您不应该捕获这么多嵌套异常。您的代码应该在可能发生特定(而非一般)异常(如文件IO异常)和您可以处理的点处处理这些异常。然后,如果您想要一个catch-all异常处理程序,请在代码的顶层放置一个异常处理程序。否则,所有这些常规异常处理程序都会导致代码出现错误。