在C#中,我如何更改异常对象的Message
?
额外闲聊
Exception
的Message
属性是只读的:
public virtual string Message { get; }
进一步阅读
在PHP中,同样的问题被回答为"你不能",但提供了一个解决方法:
但是,您可以确定它的类名和代码,然后抛出一个新的相同类别、相同代码但不同消息的异常。
如何在C#中确定异常的类名,并抛出一个相同类别但具有不同消息的新异常?
例如:
catch (Exception e)
{
Exception e2 = Activator.CreateInstance(e.GetType());
throw e2;
}
不起作用是因为异常的Message
属性在.NET中是只读的。请参见原问题。
更新
我尝试捕获我预期的每种异常类型:
try
{
reader.Read();
}
catch (OleDbException e)
{
throw new OleDbException(e, sql);
}
catch (SqlException e)
{
throw new SqlException (e, sql);
}
catch (IBM.DbException e)
{
throw new IBM.DbException(e, sql);
}
catch (OdbcException e)
{
throw new OdbcException (e, sql);
}
catch (OracleException e)
{
throw new OracleException (e, sql);
}
现在我的代码强制依赖于不会存在于每个解决方案中的程序集。
而且,现在异常似乎来自我的代码,而不是抛出它的行;我失去了异常的位置信息。
InnerException
的堆栈替换我新throw
的堆栈,或者有一种方法可以从当前异常来的地方追溯抛出异常的位置,那么它就能够解决问题。我一直在抛出自己的自定义异常,但这只是一个临时的解决办法,我需要一个真正的解决方案(因此提了这个 SO 问题)。 - Ian BoydInnerException
仍然可以被检索,这样就可以保留原始的堆栈跟踪(以及原始异常详细信息的整个上下文,如果您需要其他内容)。.InnerException
只是提供了底层的Exception
实例。 - stormont