【发布时间】:2012-07-25 03:54:11
【问题描述】:
我想要一个从异常中提取信息的中心位置,将我需要的所有信息设置为它的消息参数,然后将该信息作为相同类型的异常重新抛出。
更好的解决方案可能是在最终处理异常(并记录其消息)的地方执行此操作,但是.. 我可以控制抛出异常的地方,而不是接收异常的地方异常,仅记录其 Message 内容。
除了那个设计决定并且考虑到消息是一个只读属性,我会(?)以某种方式创建一个新的异常对象,有没有办法使新的异常对象与原来的类型相同?
这是我的代码,它无法编译 - 它在抛出线(我尝试动态转换对象)上绊倒。
public static void RethrowExceptionWithFullDetailInMessage(string msg, Exception ex)
{
Exception curEx = ex;
int cnt = 0;
while (curEx != null)
{
msg += "\r\n";
msg += cnt++ + " ex.message: " + curEx.Message + "\r\n";
msg += "Stack: " + curEx.StackTrace;
curEx = curEx.InnerException;
}
object newEx = Convert.ChangeType(new Exception(msg), ex.GetType());
throw (ex.GetType())newEx;
}
这样做
throw (Exception)newEx;
保留类型? (它编译。)
Convert.ChangeType 是否确保我得到正确类型的异常?
【问题讨论】:
-
一目了然,您在此处尝试在消息方面执行的操作似乎已通过
Exception.ToString()方法完成。如果您生成并抛出这样的新异常(您的中断将在此方法中发生,而不是在实际发生异常的地方发生),您将丢失一定数量的上下文并使调试变得更加困难。另外我认为您可能需要一个通用方法来生成正确的类型,但我可能错了...... -
你有没有用更简单的
throw (Exception)newEx遍历调试器,看看它是否保持类型? -
Exception.ToString 效果很好。输出需要一点时间来适应,但除此之外,它似乎完全符合我的要求。 (仅用于将来的编码,不适用于手头的问题,或将其分配给消息。)
-
在这里为所有答案添加评论:这是一个很好的例子,可以为一个糟糕的(设计)问题获得一些真正有见地的答案!至少现在我确定将来如何开始类似的事情。另外,我总是很想了解一些关于反思的知识,我今天确实做到了。非常感谢大家!
标签: c# exception casting throw