这是我使用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元素
- 错误处理程序的完整示例