我只需要获取没有调用堆栈或任何其他字符串的异常消息。
我认为使用Exception.Message
就足够了,但它一直给我与调用堆栈混合的消息。您知道如何摆脱Exception.Message
附带的所有其他信息吗?
try
{
}
catch (Exception ex)
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Message", "alert('" + ex.Message + "');", true);
}
这是我使用ex.Message
时得到的:
System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.NullReferenceException:对象引用未设置为对象的实例。在WebService.ProcessRequestArc .............---内部异常堆栈跟踪结束---
当我只需要的是:
服务器无法处理请求
有没有办法只获取该部分信息?
答案 0 :(得分:3)
您此处未使用Message
属性...
ex.ToString()
你需要
ex.Message
另外,这个Alert
仅供您方便吗?您应该考虑在屏幕上显示错误标签,因为pop-up
总是看起来很乱。
编辑:您还应该查看更具体的例外情况,而不是捕捉所有类型的处理方式。看一下try块中可能存在的异常,并适应它们......例如......
catch (SoapException ex)
{
//handle
}
catch (Exception e)
{
//handle
}
确保在最终Exception
阻止之前出现更具体的异常。
答案 1 :(得分:2)
使用ex.Message
只返回开发人员的自定义消息,或者,如果没有指定,则返回异常类的名称(即“抛出类型'SomeException'的异常”)。
public virtual String Message
{
get
{
if (_message != null)
return _message;
if (_className == null)
_className = GetClassName();
return Environment.GetResourceString("Exception_WasThrown", _className);
}
}
如果链上的某段代码在抛出它之前将整个堆栈跟踪存储在异常的Message
属性中,那么这可能会解释您所看到的内容。
您所描述的是意外行为,更典型的是调用ex.ToString()
,它连接Message
(或类名,如果没有),ToString()
的结果内部异常和堆栈跟踪。
public override String ToString()
{
String message = Message;
String s;
if (message == null || message.Length <= 0)
s = GetClassName();
else
s = GetClassName() + ": " + message;
if (_innerException != null)
s = s + " ---> " + _innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine +
" " + Environment.GetResourceString("Exception_EndOfInnerExceptionStack");
string stackTrace = GetStackTrace(needFileLineInfo);
if (stackTrace != null)
s += Environment.NewLine + stackTrace;
return s;
}
答案 2 :(得分:2)
Exception.Message对于通用例外是正确的。
的详细信息以下是一个例子:
namespace ExceptionHandlingTestConsole
{
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("do something");
throw new System.Web.Services.Protocols.SoapException();
//throw new Exception("my exception", new Exception("my inner exception"));
}
catch (System.Web.Services.Protocols.SoapException soapEx)
{
Console.Write("Detail: ");
Console.WriteLine(soapEx.Detail);
Console.Write("Node: ");
Console.WriteLine(soapEx.Node);
Console.Write("Role: ");
Console.WriteLine(soapEx.Role);
Console.Write("Message: ");
Console.WriteLine(soapEx.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("inner exception msg: " + ex.InnerException.Message);
}
}
Console.ReadKey();
}
}
}
答案 3 :(得分:1)
你真的很亲密......你拥有的就是这个:
try
{
}
catch (Exception ex)
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Message", "alert('" + ex.ToString() + "');", true);
}
你需要的是:
try
{
}
catch (Exception ex)
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Message", "alert('" + ex.Message + "');", true);
}
错误消息针对正在处理异常的开发人员。 Message属性的文本应该完整地描述错误,并且在可能的情况下,还应该解释如何更正错误。顶级异常处理程序可以向最终用户显示消息,因此您应该确保它在语法上是正确的,并且消息的每个句子都以句点结束。不要使用问号或感叹号。如果您的应用程序使用本地化的异常消息,则应确保准确翻译它们。
通过WCF服务引用使用Web服务引用也更有帮助。有关详细信息,请参阅this post上的答案。或者,您可以简单地自己抛出Soap Exception。