try中的异常的消息属性是否为空字符串或NULL?

问题描述:

我找不到一个明确的答案,以及MS文件不是最大的,所以这里找到一个答案与投入到投票地狱。try中的异常的消息属性是否为空字符串或NULL?

考虑这个简单的代码:

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

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

查找文档以备份给出的答案。

+0

当然:'抛出新的异常(“”);' – djv

+1

如果是,你会做什么不同? –

+0

@DStanley当然我会考虑它,但这不是我所要求的...... –

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

构造函数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对于其中Message属性标记为virtual其他异常的基类。
这意味着Message可以是空字符串或null,因为每个派生类都可以覆盖它。在ExceptionMessage

但是实际执行的样子

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

+0

虚拟......这就是我所缺少的。 –

+0

如果派生类重写属性getter,则可能返回'null'。 –

+1

@丹斯利,正如我在答案的顶部所说的那样。底部的句子是关于基类“Exception”的 – Fabio