有可能只从Exception.Message中提取有意义的信息吗



这是我使用Exception.Message:时得到的结果

System.Web.Services.Protocols.SoapException:服务器无法处理请求。--->System.NullReferenceException:未将对象引用设置为中对象的实例。在WebService.ProcessRequestArc中…---内部异常堆栈跟踪结束---

在我的示例中,是否可以配置web应用程序,使异常仅发送粗体中的部分?

或者你知道有什么方法可以只提取那部分吗?

异常的Message属性不遵循任何模式。特别是,Message属性将根据当前的区域性设置(语言)而有所不同。

但是,即使您只关心一种语言,也不应该依赖于Message属性中的任何内容。它只是包含引发异常的开发人员认为您可能希望看到的内容。

特别是,它不包含任何应该向用户显示的内容!

一开始我不太理解你的问题。为了避免看到堆栈跟踪,您只需要显示Server.GetLastError().Message。在进一步的检查中,我发现您的问题是异常被包装到HttpException中,并且来自的HttpException的消息将方法信息与原始异常消息连接起来。

解决方案

web.config中,您需要添加一个自定义错误部分。

<customErrors defaultRedirect="Error.aspx"
    mode="On" redirectMode="ResponseRewrite">

Error.aspx中,您可以执行以下操作来检查它是否是HttpException,如果是,则获取内部异常的消息。

var ex = Server.GetLastError();
string message;
if (ex != null)
{
    message = ((ex is HttpException || ex is SoapException) && ex.InnerException != null) 
        ? ex.InnerException.Message : ex.Message;
}
else
{
    message = "An error has occurred.";
}
Response.Write(message);

在您的页面上,您只想显示Server.GetLastError().Message.

以下是除以零误差的前后:

  • 之前:Default.aspx(4):错误CS0020:除以常数零
  • 之后:试图除以零

要使SoapException的InnerException属性实际不为null,则需要抛出一个内部有实际异常的SoapException。

以下是MSDN中关于customErrors部分和错误处理的一些链接:

  • customErrors元素
  • 错误处理程序的完整示例

最新更新