c#返回组合异常

时间:2016-02-29 11:49:25

标签: c# exception

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

我在我的windows-service中分发了多个自定义异常,我希望将其返回到启动流程步骤的主流程。

我有静态类PropertyMapper,它使用反射来读取email-headers并将它们反映到特定的属性。现在,如果出现异常,我想添加其他信息。就像headerattribute实际上引起异常一样,但我不想失去“实际”异常。

目前它看起来像这样:

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);
}

我抛出Exception将它带回主进程,这样我只需要实现一次“create logEntry-logic”。 '

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);
}

当然,我最初的例外情况已经丢失了,因为我没有将它添加到我的自定义异常中,但是我该怎么做呢?另外,我的思维方式是正确的,还是我必须以另一种方式处理异常?

我已经google了一点,但是找不到有用的东西。我很感激一些帮助。 :)

P.S。我提取CreateLogEntry方法中的所有InnerExceotions并将它们放入一个字符串-var。

2 个答案:

答案 0 :(得分:3)

将原始异常包含在InnerException字段中(在第一个代码示例的catch中):

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

答案 1 :(得分:1)

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

String[] marks = new String[100]; Pattern pattern = Pattern.compile(","); // <== this File file = new File("sd100-marks.csv"); try (BufferedReader reader = new BufferedReader(new FileReader(file))) { for (int i = 0; i < 100; i++) { marks[i] = pattern.split(reader.readLine())[1]; // we need the part after the comma i.e. index = 1 } } catch (IOException e) { e.printStackTrace(); } for (int i = 0; i < 100; i++) { System.out.println(marks[i]); } ,然后stracktrace消失,(重置)但是当你使用时:

throw ex然后它没有。

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

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); } } }

有用的链接:

Throwing Custom Exception Best Practices

Is there a difference between “throw” and “throw ex”?

Best Practices for Exceptions

Throw exception but persist stack trace