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

Is the message attribute of an exception in try catch ever an empty string or NULL?

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

考虑这个简单的代码:

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

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

也请寻找文档来支持给出的答案。

当然有可能 - 自定义异常(继承自 Exception 的异常)可能 return 为 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;
        }
    }
}

Exception 是 class 其他异常的基础 Message 属性 被标记为 virtual.
这意味着 Message 可以是空字符串或 null,因为每个派生的 class 都可以覆盖它。

然而 MessageException class 中的实际实现看起来像

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

        } 
        else 
        {
            return _message;
        }
    }
}

所以你可以从上面看到,null 永远不会从 Exception base class 返回,但是当 throw new Exception(string.Empty);[=21 时会返回空字符串=]