【问题标题】:Is the message attribute of an exception in try catch ever an empty string or NULL?try catch 中异常的消息属性是空字符串还是 NULL?
【发布时间】:2017-08-28 14:41:48
【问题描述】:

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

考虑这个简单的代码:

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

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

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

【问题讨论】:

  • 当然:throw new Exception("");
  • 如果是,你会怎么做?
  • @DStanley 当然我会解释它,但这不是我要问的......

标签: c# exception-handling try-catch


【解决方案1】:

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

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

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

这是一个示例,填写您的示例代码:

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

【讨论】:

    【解决方案2】:

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

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

    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); 时会返回空字符串

    【讨论】:

    • 虚拟的……这就是我所缺少的。
    • null 如果派生类覆盖属性 getter,则可能返回。
    • @DStanley,正如我在答案顶部所说的那样。底句是关于基类Exception
    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多