まず、何が起こっているのかはわかっていると思いますが、この問題をここで取り上げて議論し、私が考えている以外の誰かがこれに対する「答え」を持っているかどうかを確認したいと思いました。なぜなら、それは私には完全には意味がありません。
私が見つけたのは、例外のエラーログを作成するときに、これを実行していて、機能していなかったことです。
catch( Exception ex )
{
LogException( ex.Message );
if ( !string.IsNullOrEmpty( ex.InnerException.Message ) )
{
LogInnerException( ex.InnerException.Message );
}
}
そして、見よ、これを実行すると、NullReferenceExceptionが発生することがよくありました。は?
nullをチェックしていますよね?
今、私はこれを使用する必要があります:
if ( ex.InnerException != null && !string.IsNullOrEmpty( ex.InnerException.Message )
しかし、それは直感に反し、生産性にも反しているようです。なぜなら、私がこれを行うと、一体、次のようになります。
if ( !string.IsNullOrEmpty( null ) )
それは私に何の問題も与えません。そして、ex.InnerExceptionがnullの場合、確かにex.InnerException.Messageはnullですよね?
どうやらそうではありません。
これを再現する完全なコンソールアプリを作成しました。もし、あんたが
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace stringisnullorempty
{
class Program
{
static void Main( string[] args )
{
if ( !string.IsNullOrEmpty( null ) )
{
Console.WriteLine( "Ha ha ha, right...." );
}
MyBClass bClass = new MyBClass();
bClass.BClassName = "Some B Class Name";
if ( !string.IsNullOrEmpty( bClass.AClass.AString ) ) //<== Exception occurs here.
{
Console.WriteLine( bClass.AClass.AString );
}
}
}
public class MyAClass
{
private string aString;
public string AString
{
get
{
return aString;
}
set
{
aString = value;
}
}
private int aValue;
public int AValue
{
get
{
return aValue;
}
set
{
aValue = value;
}
}
public MyAClass() { }
}
public class MyBClass
{
private MyAClass aClass;
public MyAClass AClass
{
get
{
return aClass;
}
set
{
aClass = value;
}
}
private string bClassName;
public string BClassName
{
get
{
return bClassName;
}
set
{
bClassName = value;
}
}
public MyBClass() { }
}
}
私が起こっていると思うのは、IsNullOrEmptyを処理しようとする前に、コードがex.InnerException.Messageを処理することです。ex.InnerExceptionがnullであるため、ex.InnerException.Messageにアクセスしようとすると例外が発生します。
でも気になりますが、完全なチェックが必要ですか?ex.InnerException!=nullで十分でしょうか。内部例外がある場合、常にそれに関連付けられたメッセージがありますか?
ありがとう。