2017-04-26 36 views
0

我有DLL脚本。在那个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()来查看发生了什么错误?

+1

您只需'throw'在'Scripter'类的例外,赶上他们在'try/catch语句'在你的应用程序中,不需要创建一个事件。 – Pikoh

+0

这实际上很容易做到,但我会建议反对它。异常和事件是完全不同的事情,异常不应该使用事件来处理,而应该使用try ... catch。 –

回答

0

你可以尝试修改类的编剧这样

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和接收有关异常的通知。你必须在每一个你捕捉异常

希望这有助于

+0

谢谢你的帮助 – Essien

1

由于Picoh和佐尔坦评论你的问题,你可以很容易地包装方法调用中try/catchScripter方法调用的地方OnErrorOcurred。但是,如果你想使用事件(自定义参数),你可以做这样的事情:

//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 
} 
相关问题