C# 返回组合异常

本文关键字:异常 组合 返回 | 更新日期: 2023-09-27 18:36:39

我不太确定如何提出这个问题。我真的希望我能正确地解释我的问题是什么。

我的Windows服务中分布了多个自定义异常,我想将其反馈给启动流程步骤的主进程。

例如,我有静态类 PropertyMapper,它使用反射来读取电子邮件标头并将它们反映到特定属性。现在,如果出现异常,我想添加其他信息。就像什么标头属性实际导致异常一样,但我不想丢失"实际"异常。

目前它看起来像这样:

try
{
    PropertyInfo pInfo = prop.Property;
    Type t = Nullable.GetUnderlyingType(pInfo.PropertyType) ?? pInfo.PropertyType;
    object safeValue = (headerAttribute.Value == null) ? null : Convert.ChangeType(headerAttribute.Value, t);
    pInfo.SetValue(mailDataObj, safeValue, null);
}
catch (Exception e)
{
    throw new PropertyMappingFailedException(headerAttribute.Field, headerParam);
}

抛出异常以将其带回主进程,这样我只需要实现一次"创建日志条目逻辑"。´

try
{
    mailDataObj = PropertyMapper.MapProperties(mailItem);
    mailDataObj.MailItem = mailItem;
    controller = new DAKMailController(mailDataObj);
    controller.SetBasicData(procFile);
    controller.HandlePostProcessing();
}
catch (Exception e)
{
    controller.CreateLogEntry(e);
    moveFileToError(file);
}
现在,我

最初咳嗽的异常当然丢失了,因为我没有将其添加到我的自定义异常中,但是我该怎么做呢?另外,我的思维方式是否正确,还是必须以其他方式处理异常?

我已经用谷歌搜索了一下,但找不到有用的东西。我将不胜感激。:)

附言我提取了 CreateLogEntry-method(方法)中的所有 InnerExceotions,并将它们放入单个字符串变量中。

C# 返回组合异常

原始异常包装在 InnerException 字段中,如下所示(在第一个代码示例的捕获中):

throw new PropertyMappingFailedException(headerAttribute.Field, headerParam)
{ InnerException = e };

通常,您不会相互添加异常,但在以下情况下对堆栈跟踪求和:

throw ex ,则 stracktrace 消失了(重置),但当您使用:

throw,那就没有了。

此外,您总是捕获所有类型的异常,但您没有添加堆栈跟踪。最佳实践看起来更像这样:

class Foo
{
    DoSomething(int param)
    {
        try 
        {
             if (/*Something Bad*/)
             {  
                 //violates business logic etc... 
                 throw new FooException("Reason...");
             }
             //... 
             //something that might throw an exception
        }
        catch (FooException ex)
        {
             throw;
        }
        catch (Exception ex)
        {
             throw new FooException("Inner Exception", ex);
        }
    }
}

所以总而言之,你需要玩Inner Exception

有用的链接 :

引发自定义异常最佳做法

"投掷"和"投掷前任"有区别吗?

例外的最佳做法

引发异常但保留堆栈跟踪