我不太确定如何提出这个问题。我真的希望我能解释一下我的问题是什么。
我在我的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。
答案 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