try catch中的异常的message属性是空字符串还是NULL?

时间:2017-08-28 14:41:49

标签: c# exception-handling try-catch

我找不到明确的答案,而MS文档也不是最好的,所以这里找到答案而不是被投入到投票地狱。

考虑这个简单的代码:

    try
    {
        if (errMessage.Contains(EXCEPTIONCOMPARISONMESSAGE))
        {
            //do stuff;
        }
    }
    catch (Exception ex)
    {
        eventLog.WriteEntry("isAbleConvertToPDF: " + ex.Message, EventLogEntryType.Error);
    }

我的问题是ex.Message将是一个空字符串还是NULL?我认为不是,但我找不到明确的答案。

请寻找文件以备份答案。

2 个答案:

答案 0 :(得分:2)

它当然可能 - 自定义异常(从Exception继承的异常)可能返回null或空字符串。

Exception构造函数还将消息作为参数,可以是空字符串。

接口协定中没有任何内容表明消息永远不会为空或为空,因此您应该假设它可以为空或为空。

以下是一个示例,填写示例代码:

try
{
    if (errMessage.Contains(EXCEPTIONCOMPARISONMESSAGE))
    {
        throw new MyEvilException();
    }
}
catch (Exception ex)
{                                                V--------V this will be null
    eventLog.WriteEntry("isAbleConvertToPDF: " + ex.Message, EventLogEntryType.Error);
}

private class MyEvilException : Exception
{
    public override String Message 
    {
        get 
        {  
            return null;
        }
    }
}

答案 1 :(得分:2)

ExceptionMessage属性标记为virtual的其他例外的基类。
这意味着Message可以是空字符串或null,因为每个派生类都可以覆盖它。

然而,Message类中Exception的实际实现类似于

public virtual String Message 
{
    get 
    {  
        if (_message == null) 
        {
            if (_className==null) 
            {
                _className = GetClassName();
            }
            return Environment.GetResourceString("Exception_WasThrown", _className);

        } 
        else 
        {
            return _message;
        }
    }
}

从上面可以看出,null基类永远不会返回Exception,但throw new Exception(string.Empty);

时会返回空字符串