如何使用事件创建异常处理程序

时间:2017-04-26 13:43:35

标签: c# events exception-handling

我有脚本编写脚本。在那个dll中,我有一个名为Scripter的类。在Scripter类中,我调用了一些从MySQL数据库(LoadTables())加载数据的方法。在那些从MySQL数据库异常加载数据的函数可能会发生。我希望以后能够在我的应用程序中使用Scripting.dll来执行以下操作:

 Scrpter sc = new Scripter();
 sc.OnError += ErrorOccured;

并希望在我的应用程序中使用ErrorOcured功能,如:

private void ErrorOccured(Exception exception)
{...}

我需要在Scripter类中拥有什么,以及如何在LoadTables中的catch块中传递异常,以便稍后我可以使用ErrorOcured()来查看发生了什么错误?

2 个答案:

答案 0 :(得分:1)

正如Picoh和Zoltan对您的问题发表评论,您可以轻松地将方法调用包装到Scripter块中的try/catch方法。但是,如果你想使用事件(使用自定义args),你可以这样做:

//your class
public class Scripter
{
    public Scripter()
    {
    }

    //public event with custom event args
    public EventHandler<ScripterErrorEventArgs> OnError;

    //just for test
    public void RaiseError()
    {
        //error which is caught here
        Exception ex = new Exception("something happened");
        OnError?.Invoke(this, new ScripterErrorEventArgs(ex));
    }
}

//class for custom event args. add your own other properties as needed
public class ScripterErrorEventArgs : EventArgs
{
    public ScripterErrorEventArgs()
    {

    }

    public ScripterErrorEventArgs(Exception ex)
    {
        this.Exception = ex;
    }

    public Exception Exception { get; set; }
}


//usage
public void someMethod()
{
    Scripter s = new Scripter();
    s.OnError +=  new EventHandler<ScripterErrorEventArgs>(LogError)
    s.RaiseError();
}

private void LogError(object sender, ScripterErrorEventArgs e)
{
    //your code here
}

答案 1 :(得分:0)

您可以尝试像这样修改您的Scripter类

class Scripter
{
    public event EventHandler<Exception> ErrorOcurred;

    protected virtual void OnErrorOcurred(Exception e)=>ErrorOcurred?.Invoke(this, e);

    public void ThrowsException()
    {
        try
        {
            throw new Exception("Throws exception");
        }
        catch (Exception ex)
        {
            OnErrorOcurred(ex);
        }
    }
}

这样您就可以订阅ErrorOcurred并接收有关异常的通知。您必须在捕获异常的每个地方调用OnErrorOcurred

希望这有帮助