如何在没有调用堆栈的情况下获取Exception消息

时间:2013-12-07 00:13:51

标签: c# asp.net exception

我只需要获取没有调用堆栈或任何其他字符串的异常消息。

我认为使用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 .............---内部异常堆栈跟踪结束---

当我只需要的是:

  

服务器无法处理请求

有没有办法只获取该部分信息?

4 个答案:

答案 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对于通用例外是正确的。

查看SoapException

的详细信息

以下是一个例子:

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); 
}

来自documentation

  

错误消息针对正在处理异常的开发人员。 Message属性的文本应该完整地描述错误,并且在可能的情况下,还应该解释如何更正错误。顶级异常处理程序可以向最终用户显示消息,因此您应该确保它在语法上是正确的,并且消息的每个句子都以句点结束。不要使用问号或感叹号。如果您的应用程序使用本地化的异常消息,则应确保准确翻译它们。

通过WCF服务引用使用Web服务引用也更有帮助。有关详细信息,请参阅this post上的答案。或者,您可以简单地自己抛出Soap Exception