C#异常监听器

时间:2017-07-17 17:27:01

标签: c# exception-handling callback

C#问题。任意类Class具有方法Foo(),这是一种可以抛出异常的方法。有没有办法向bar()添加私有回调机制Class,这样如果Foo()抛出异常,bar()执行将在之前触发 >投掷继续上升?如果发生这种情况,那么在发现异常之后呢?

- 编辑 -

由于一些最初的评论是"这让你感到困惑的是你在做什么"我将进一步解决这个问题。

我想要一个异常监听器的原因是因为我有一些关于类Class的公开可读的布尔状态,我想在抛出异常时将其设置为true。由于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,它们将会运行&#39;使用某些object当且仅当<{em} IContext首次成功通过了“验证”时才会使用检查使用相同的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(',');
    };
}

在这里,我们演示了IContext的常见实现,这样一旦Run方法抛出一个ExceptionRun方法就会无法访问由于IsContextStillValid随后总是返回false。

现在假设在Run(object)的实现中还有其他抛出异常的调用。问题是每次我们想要抛出一个新的异常时,我们必须将代码复制到_hasError = true; throw new Exception(...);的效果。理想情况下,异常监听器会为我们解决这个问题,如果你们中的任何一个人知道如何实现它,我很好奇。

希望有所帮助。

1 个答案:

答案 0 :(得分:0)

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