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,并将它们放入单个字符串变量中。
将
原始异常包装在 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
有用的链接 :
引发自定义异常最佳做法
"投掷"和"投掷前任"有区别吗?
例外的最佳做法
引发异常但保留堆栈跟踪