如何在C#中更改Exception对象的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);
}
只是现在我的代码强制依赖于程序集,而这并不是每个解决方案中都存在的。
而且,现在异常似乎来自我的代码,而不是引发它的那一行;我丢失了异常的位置信息
9条答案
按热度按时间flmtquvp1#
创建一个新的
Exception
(或者更好的特定子类型),它包含新消息(并将原始异常作为InnerException
传递)。例如:
注意:如果你真的想使用
Activator.CreateInstance
,你可以使用一个可以传递参数的重载,但是不同的Exception派生类型不能依赖于(message, innerException)
的构造函数重载。41zrol4v2#
我在a blog post中找到了从a news site链接的解决方案:
它并不完美(您会丢失堆栈跟踪);但这就是. NET的本质
0yycz8jy3#
我只是想在这里为Ian补充一下他的答案。如果你在blog post中使用这个技术,你不会丢失堆栈。是的,你会丢失最后一个异常的
StackTrace
成员中的堆栈,但是你不会因为内部异常而丢失整个堆栈。看这里:如果您获取异常的完整字符串,则会得到:
所以你得到了整个堆栈,加上额外的信息
lnxxn5zx4#
您可以通过反射更改异常消息,如下所示...
所以你可以创建一个扩展方法...
然后用它...
你必须记住如果你使用“throwex;“堆栈跟踪将丢失。
要避免这种情况,必须使用“throw;“无一例外**。
fnvucqvd5#
您可以将先前的异常 Package 在一个包含新消息的新异常中,并将内部异常用于堆栈跟踪等。
llew8vvj6#
在我看来,最好的方法是从Exception(或其他框架提供的异常类)继承,然后将消息字符串放在对基构造函数的调用中,该构造函数将Message作为参数,如下所示:
quhf5bfb7#
我知道这是一个很老的问题,但我不认为任何现有的答案是理想的(他们隐藏异常细节innerExceptions或掩码行号)。我使用的方法是使用静态工厂方法而不是构造函数示例化异常:
因此,您现在可以抛出:
第一个月
把信息修改到你满意的程度。
rhfm7lfc8#
处理这个问题的最好方法是编写适合这种特殊情况的自己的异常类。然后捕获异常,并抛出自己的异常。您可能希望看到以下内容:Exception Constructors -> Exception(String) | MS Docs了解更多信息。
如果您觉得自定义异常不是必需的,则应该能够在引发异常时将自定义字符串传递给Exception构造函数:设计Custom Exceptions | MS Docs
niwlg2el9#
它是虚拟的(在Net4.6和Net6中),所以你可以在你的自定义异常类中覆盖它。
下面是一个如何在Net4.6中提取WebException响应消息并将其放入Message Property的示例。