【问题标题】:Is it possible to extract only the meaningful informantion from Exception.Message是否可以仅从 Exception.Message 中提取有意义的信息
【发布时间】:2013-12-07 11:58:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • 自定义错误? (msdn.microsoft.com/en-us/library/h0hfz6fc(v=vs.100).aspx);或者global.asax - Application_Error ?
  • @abhitalks 如何使用自定义错误仅显示我想要的部分?或至少显示消息的较短版本
  • 显示在哪里?你是说YSOD吗?如果是,那么只需创建一个包含您想要显示的内容的页面,并在 web.config 的 customerrors 部分中指定该页面。如果没有,请详细说明。
  • @abhitalks 抛出异常时,我将 Exception.Message 发送到通知栏,但 Exception.Message 不仅发送异常的实际原因,而且还发送我不发送的其他信息'不想在通知栏中显示
  • 在这种情况下,将其发送到通知栏:"The server can not process the request, because " + Exception.Message.Substring(0,Exception.Message.IndexOf(":"))

标签: asp.net exception


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    一开始我不太明白你的问题。为了避免看到堆栈跟踪,您只需显示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 部分和错误处理的一些链接:

    【讨论】:

    • 我需要获取 Exception.Message 的一部分,该部分不应包含调用堆栈或内部异常的信息。
    • 我明白了。我稍微更新了我的答案,但是您要么需要抛出一个肥皂异常,要么像 cmets 中建议的那样解析字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2012-06-29
    • 2013-02-01
    相关资源
    最近更新 更多