C# 在Finally块中创建2个异常

C# 在Finally块中创建2个异常,c#,exception,C#,Exception,我有以下代码: finally { if (!isDnsSet) { var exception = new Exception(<DNS-INFORMATION>); localLog.TraceException(exception); throw exception; } } 异常处理程序不能接收和处理longException,并作为其功能

我有以下代码:

finally
{
    if (!isDnsSet)
    {
        var exception = new Exception(<DNS-INFORMATION>);
                        localLog.TraceException(exception);
                        throw exception;
    }
}

异常处理程序不能接收和处理longException,并作为其功能的一部分抛出shortException吗?

异常处理程序不能接收和处理longException,并作为其功能的一部分,抛出shortException?

我认为更干净的方法是将较长的异常作为内部异常:

finally
{
    if (!isDnsSet)
    {
        var innerException = new Exception(<not so short and sweet but still useful for other devs>);
        var exception = new Exception(<short and sweet message>, innerException);
        localLog.TraceException(exception);
        throw exception;
    }
}
public class DetailedException : Exception {
    public string DetailedMessage { get; }
    public DetailedException(string longMessage, string shortMessage) : base(shortMessage) {
        DetailedMessage = longMessage;
    }
}
最后
{
如果(!isdnset)
{
var innerException=新异常();
var异常=新异常(,innerException);
localLog.TraceException(异常);
抛出异常;
}
}

这样,抛出的异常和记录的异常之间就保持了一致性,从而使诊断更容易。

我认为一种更干净的方法是将较长的异常作为内部异常:

finally
{
    if (!isDnsSet)
    {
        var innerException = new Exception(<not so short and sweet but still useful for other devs>);
        var exception = new Exception(<short and sweet message>, innerException);
        localLog.TraceException(exception);
        throw exception;
    }
}
public class DetailedException : Exception {
    public string DetailedMessage { get; }
    public DetailedException(string longMessage, string shortMessage) : base(shortMessage) {
        DetailedMessage = longMessage;
    }
}
最后
{
如果(!isdnset)
{
var innerException=新异常();
var异常=新异常(,innerException);
localLog.TraceException(异常);
抛出异常;
}
}

这样,抛出的异常和记录的异常之间就保持了一致性,从而使诊断更容易。

一种方法是创建一个自定义异常,该异常包含长消息和短消息。在库外部获得异常的用户将通过
exception
message
属性访问短消息,而
TraceException
方法将通过自定义异常提供的附加属性访问长版本:

finally
{
    if (!isDnsSet)
    {
        var innerException = new Exception(<not so short and sweet but still useful for other devs>);
        var exception = new Exception(<short and sweet message>, innerException);
        localLog.TraceException(exception);
        throw exception;
    }
}
public class DetailedException : Exception {
    public string DetailedMessage { get; }
    public DetailedException(string longMessage, string shortMessage) : base(shortMessage) {
        DetailedMessage = longMessage;
    }
}
内部
TraceException
方法:

var message = (exception as DetailedException)?.DetailedMessage ?? exception.Message;

一种方法是创建一个自定义异常,该异常同时包含长消息和短消息。在库外部获得异常的用户将通过
exception
message
属性访问短消息,而
TraceException
方法将通过自定义异常提供的附加属性访问长版本:

finally
{
    if (!isDnsSet)
    {
        var innerException = new Exception(<not so short and sweet but still useful for other devs>);
        var exception = new Exception(<short and sweet message>, innerException);
        localLog.TraceException(exception);
        throw exception;
    }
}
public class DetailedException : Exception {
    public string DetailedMessage { get; }
    public DetailedException(string longMessage, string shortMessage) : base(shortMessage) {
        DetailedMessage = longMessage;
    }
}
内部
TraceException
方法:

var message = (exception as DetailedException)?.DetailedMessage ?? exception.Message;


如果您想记录一个异常并抛出另一个异常,这可能是最简洁的。我不得不说,我并不热衷于在抛出异常时对异常进行编辑的想法——似乎应该在堆栈的更高层做出决定,否则诊断问题可能会很困难。只是我想到了从finally-not catch块抛出异常的想法有点奇怪?这是一个完整的方法,具有
try->catch->finally
。我刚决定不考虑这一部分,你有没有考虑过把“longException”作为“shortException”中的innerException?我不确定它是否更优雅,但它可能允许您记录并引发同一个异常。如果您想记录一个异常并引发另一个异常,这可能是最简洁的。我不得不说,我并不热衷于在抛出异常时对异常进行编辑的想法——似乎应该在堆栈的更高层做出决定,否则诊断问题可能会很困难。只是我想到了从finally-not catch块抛出异常的想法有点奇怪?这是一个完整的方法,具有
try->catch->finally
。我刚决定不考虑这一部分,你有没有考虑过把“longException”作为“shortException”中的innerException?我不确定它是否更优雅,但它可能允许您记录并引发相同的异常。我在这个解决方案和@dasblinkenlight的解决方案之间左右为难。你能详细解释一下为什么这会保持一致吗?当用户报告问题时,他们会报告他们所看到的。如果他们看到的消息没有准确反映在日志中,则很难诊断问题。根据您记录异常的方式,您可以同时记录短消息和长消息。因此,我想向他们显示
short
消息,但要记录
long
消息。我想知道,与我最初提出的方法相比,内部异常如何帮助我解决这一问题?@User5842如果您使用类似
ex.ToString()
的方法来记录异常,则内部异常可以记录这两个异常,而不必显式地这样做。记录较短的消息有助于交叉引用用户反馈。如果你只是记录长消息,可能很难将用户反馈与日志进行交叉引用。好的,为了便于学习,请澄清一下。使用上述方法,我可以像往常一样继续使用我的
TraceException
方法,但现在它将为我记录这两个异常,使开发人员更容易找到根本原因。除此之外,我还能够向用户发送更新、更简洁的消息?我在这个解决方案和@dasblinkenlight的解决方案之间左右为难。你能详细解释一下为什么这会保持一致吗?当用户报告问题时,他们会报告他们所看到的。如果他们看到的消息没有准确反映在日志中,则很难诊断问题。根据您记录异常的方式,您可以同时记录短消息和长消息。因此,我想向他们显示
short
消息,但要记录
long
消息。我想知道,与我最初提出的方法相比,内部异常如何帮助我解决这一问题?@User5842如果您使用类似
ex.ToString()
的方法来记录异常,则内部异常可以记录这两个异常,而不必显式地这样做。记录较短的消息有助于交叉引用用户反馈。如果你只是记录长消息,可能很难将用户反馈与日志进行交叉引用。好的,为了便于学习,请澄清一下。使用上述方法,我可以像往常一样继续使用我的
TraceException
方法,但现在它将为我记录这两个异常,使开发人员更容易找到根本原因。除此之外,我还能够向用户抛出更新、更简洁的消息?只是为了提供更多的上下文信息