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(...);
に複製する必要があることです。理想的には、例外リスナーが私たちのためにこの問題を解決するでしょう。誰かが実装する方法を知っていれば、私は不思議です。
希望に役立ちます。
あなたは実際に何をしようとしていますか?試しキャッチと再登場を使うことはできませんか?奇妙な質問のように思えます... – gilmishal
'catch'ブロックで' bar() 'を呼び出してから再びスローする' Foo() 'に' try/catch'を入れてみませんか? – David
コールスタックが巻き戻される前に、例外をキャッチブロックで技術的に使用して例外を監視できます。例については、[例外フィルタ](https://stackoverflow.com/documentation/c%23/24/c-sharp-6-0-features/46/exception-filters)のSO docを参照してください。 –