2017-07-17 12 views
-2

C#質問。任意のクラスClassには、例外をスローできるメソッドFoo()があります。プライベートコールバックメカニズムbar()Classに追加する方法はありますか?Foo()が例外をスローする場合、bar()が実行されますの前にスローがチェーンを継続していますか?それが起こり得ない場合、例外が捕捉された後はどうなりますか?C#例外リスナー

- 編集 -

初期のコメントの一部以来、私はさらにそれに対処します「これは、あなたが男に何をしているか混乱している」されています。

私が例外リスナーを希望する理由は、例外がスローされるたびにtrueに設定されたいクラスClassについて公に読めるブール状態を持っているからです。例外を投げるClass内に潜在的に複数の関数がある可能性があるので、例外がスローされるたびにhasErrorをtrueに設定するボイラープレート作業を行いたくありません。自動化、赤ちゃん。

だから、私たちのインタフェース、および主な機能は以下のとおりです。

上記のコードで
public interface IObjectProvider 
{ 
    IEnumerable<object> Allobjects { get; } 
} 

public interface IContext 
{ 
    delegate bool ContextIsStillValid(object o); 
    delegate void Run(object o); 
} 

// main program 
public static void Main() { 
    IContext context = initcontext(...); 
    IObjectProvider objectProvider = initobjectprovider(...); 

    // ...program executes for awhile... 

    foreach(var obj in objectProvider.AllObjects) 
    { 
     if(context.ContextIsStillValid(obj)) 
     { 
      try 
      { 
       context.Run(obj); 
      } 
      catch(Exception e) 
      { 
       // log the error 
      } 
     } 
    } 
} 

は、我々はいくつかのIContextを指定する意志「RUN」と最初に成功した場合のみ、IContextという場合には、いくつかのobjectを使用してその同じobjectを使用して '検証'チェックを行います。ファイン。さて、IContextの実装の一般的な変化は、(それが、私の言葉を取る)以下の通りです:

ここ
public class Class : IContext { 

    private bool _hasError = false; 

    // so our validation check is implemented with an internal flag. 
    // how is it set? 
    public bool ContextIsStillValid = (o) => !_hasError; 

    public void Run = 
    (o) => 
    { 
     string potentially_null_string = getstring(...); 
     if(potentially_null_string == null) 
     { 
      // our internal flag is set upon the need to throw an exception 
      this._hasError = true; 
      throw new Exception("string was null at wrong time"); 
     } 

     Global.DoSomethingWith(potentially_null_string.Split(','); 
    }; 
} 

、我々はRun方法は、単一のExceptionを投げたら、そのようなことを、IContextの一般的な実装を実証してきましたIsContextStillValidが常にfalseを返すため、Runメソッドは到達不能になるはずです。

Run(object)の実装では、他の例外処理呼び出しがあるとします。問題は、新しい例外をスローするたびに、コードを_hasError = true; throw new Exception(...);に複製する必要があることです。理想的には、例外リスナーが私たちのためにこの問題を解決するでしょう。誰かが実装する方法を知っていれば、私は不思議です。

希望に役立ちます。

+0

あなたは実際に何をしようとしていますか?試しキャッチと再登場を使うことはできませんか?奇妙な質問のように思えます... – gilmishal

+0

'catch'ブロックで' bar() 'を呼び出してから再びスローする' Foo() 'に' try/catch'を入れてみませんか? – David

+0

コールスタックが巻き戻される前に、例外をキャッチブロックで技術的に使用して例外を監視できます。例については、[例外フィルタ](https://stackoverflow.com/documentation/c%23/24/c-sharp-6-0-features/46/exception-filters)のSO docを参照してください。 –

答えて

0
public class MyClass 
{ 
    public void Foo() 
    { 
     try 
     { 
      //Execute some code that might fail 
     } 
     catch 
     { 
      bar(); 
      throw; 
     } 
    } 
    private void bar() 
    { 
     //do something before throwing 
    } 
} 
+0

私は、bar()自体の実行がエラーを投げる可能性があるという事実を考慮する必要があることを追加したいと思います。 – JuanR

+0

真実は、あなたがやっていることと、それをどのように振る舞いたいかによって異なります。 –

+0

@CavanPage Cavanに感謝しています。この提案は既に行われていますが、この提案はうまくいくかもしれません。 –