2016-09-29 12 views
1

C#では、子オブジェクトにtry catchブロックブロックがあり、親オブジェクトにtry catchブロックブロックがある場合、オブジェクトが例外をスローした場合、両方の例外の詳細を取得するにはどうすればよいですか?ここ子オブジェクトと親オブジェクトに例外がスローされた場合の両方の例外を取得する方法

は例外クラスです。

public class CompileObjectException : InvalidOperationException 
{ 
    private ICustomObject _ownerCustomObject { get; set; } 
    public ICustomObject OwnerCustomObject 
    { 
     get 
     { 
      return _ownerCustomObject; 
     } 
     set 
     { 
      _ownerCustomObject = value; 
     } 
    } 
    public CompileObjectException() 
    { 

    } 
    public CompileObjectException(ICustomObject ownerCustomObject, string message) 
     : base(message) 
    { 
     _ownerCustomObject = ownerCustomObject; 
    } 
} 

CompileObjectExceptionは、オブジェクトの両方でスローされる場合、OwnerCustomObjectは、例外がスローさにされているオブジェクトに設定されている

上記のコードで私は親オブジェクトと子オブジェクトの両方に対してOwnerCustomObjectを取得したいと考えています。

答えて

3

通常、親オブジェクトはInnerExceptionに子例外を含む例外をスローします。 InnerExceptionsはInnerExceptionsを持つことができるため、根本的な原因まで完全に移動できます。

EDIT:

パターンは次のようになります。

void SomeMethod() 
{ 
    try 
    { 
    } 
    catch (Exception e) 
    { 
     throw new MyException(message, e); 
    } 
} 

class MyException : Exception 
{ 
    public MyException(string message, Exception inner) 
    : base(message, inner) 
    { 
    } 
} 

明らかにそこに他の詳細ですが、それはあなたが両方を返す方法です。デフォルトでは

public class CustomObject : ICustomObject 
{ 
    public string Scope { get; set; } 
} 

public interface ICustomObject 
{ 
    string Scope { get; set; } 
} 

ExceptionToString()方法:引数のために、私はあなたのICustomObjectはこのように、その上に単一のプロパティを持っており、それを実装して具体的なクラス

+0

のInnerExceptionを見ると、値はnullです。これを私のCompileObjectExceptionクラスにコードする必要がありますか? – user3736648

+0

呼び出し側が例外情報を明示的に伝播せず、内部例外のために 'null'を取得するケースがあることに注意してください。サーバサイドコードは通常、' SqlException'のような設定情報を漏らす可能性のあるすべてのエラーをマスクするトップレベル例外ハンドラを持っています。 –

0

を仮定しますクラスはすべてInnerExceptionを再帰的にループするので、ユーザーが利用できるすべてのものが表示されます。

カスタムオブジェクトの値を取得するには、やや異なる方法が必要です。

まず、カスタム例外クラスを変更してInnerExceptionを受け入れ、baseに渡します。

public CompileObjectException(ICustomObject ownerCustomObject, string message, Exception innerException = null) 
    : base(message, innerException) 
{ 
    _ownerCustomObject = ownerCustomObject; 
} 

次に、各InnerExceptionをループしToString()メソッドをオーバーライドして、あなたのCustomObjectクラスの値を含むカスタムメッセージを作成:あなたは、いくつかのネストされたメソッドを呼び出したときに今

public override string ToString() 
{ 
    return GetInnerException(this); 
} 

private string GetInnerException(CompileObjectException e) 
{ 
    if (e == null) 
     return ""; 

    return string.Format("{0} ({1}) \n{2}", e.Message, e.OwnerCustomObject.Scope, GetInnerException((CompileObjectException)e.InnerException)); 
} 

を、そしてそれらは各々例外をスローすると、すべての例外を保存してユーザーに表示できます。

public static void Main() 
{ 
    try 
    { 
     ParentMethod(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); // implicitly calls e.ToString() 
    } 

} 

public static void ParentMethod() 
{ 
    try 
    { 
     ChildMethod(); 
    } 
    catch (Exception e) 
    { 
     throw new CompileObjectException(new CustomObject {Scope = "P"}, "Parent Message", e); 
    } 
} 

public static void ChildMethod() 
{ 
    try 
    { 
     YetAnotherChild(); 
    } 
    catch (Exception e) 
    { 
     throw new CompileObjectException(new CustomObject {Scope = "C"}, "Child Message", e); 
    } 
} 

public static void YetAnotherChild() 
{ 
    throw new CompileObjectException(new CustomObject {Scope = "C2"}, "Another Child Message"); 
} 

あなたはあなたの特定のケースのためにこれをカスタマイズするために、おそらくたいと思うでしょうが、上記の本に似たチェーンが表示されます...

Parent Message (P) 
Child Message (C) 
Another Child Message (C2) 
関連する問題