2011-09-29 27 views
1

我写一个类库,包装不同的对象 (主要是设备驱动程序的USB硬件组件)处理的OnError事件

这些设备驱动程序的一些类公开的一种“的OnError”的事件:在如果在设备驱动程序中发生运行时错误或其他错误,则触发该事件。喜欢的东西:

该解决方案的
AddHandler oDevice.DriverRunTimeErrorEvent, 
       AddressOf HandleDriverRunTimeErrorEvent 

    Private Sub HandleDriverRunTimeErrorEvent(
       ByVal sender As Object, 
       ByVal eventData As DriverRunTimeErrorEventArgs) 
     'handle the error 
    End Sub 

肯定的是,如果发生错误,程序没有停止过,但我永远不会知道,如果我不使用的情况下是什么事。

现在,将设备驱动程序包装到我的类库中,我必须考虑必须传递给将使用我的类库的客户端,以及是否应该这样做。

  1. 我可以转发设备驱动程序解决方案并在类库中生成一个新事件。然后客户端应该处理转发的事件。

  2. 但我也可以扔了所有的错误信息

  3. 我可以简单地忽略错误,只是记录它在协议文件中的一个例外。

解决方案1.似乎对我更加强大,我会使用它,但它不是“靠近”.NET世界。

解决方案2.与程序流异步抛出错误:在客户端应用程序中,我不会有任何可以捕获它的try-catch块。换句话说,如果客户端没有调用该类的任何方法,该类就会抛出错误。 当然,我可以在应用程序级别捕获所有错误,但无论如何,这会在逻辑中引入一些我更喜欢避免的模糊性。

你将如何处理这些OnError事件?

+0

我分裂了我最后一个类似的问题(http://stackoverflow.com/questions/7585336/handling-exceptions-in-a-class-library-enveloping-a-device-driver),因为我在OnError中看到事件更多的东西一个单独的问题。 – gingo

回答

1

选择3你应该总是这样做,独立于你选择的方法向用户展示错误 - 当然如果它是合理可实现的,即如果你有足够的写访问权限来存放日志。

1和2之间的选择取决于您选择将错误信息传递给用户的一般方法。在.NET世界中,抛出异常是首选,至少在标准情况下是这样,而标准的意思是如果你的界面是同步的。如果你的用户正在调用你的类的一个方法,并等待你返回一个值(或者简单地完成执行) - 那么你应该抛出一个异常,如果有什么错误'足够'

你可能需要避开抛出异常在某些情况下,如果您提供给客户端的接口是异步的。如果他们调用你的方法,并立即返回,在后台留下一个工作线程 - 然后抛出异常不是一种选择,你需要添加一个类似的基于事件的方法来让你的客户订阅错误信息 - 如果他们需要它!这是你需要决定的事情(除非你发布更多关于项目性质的细节) - 如果你只能将错误记录到文件中,那么为什么还要麻烦提高事件呢?

还有另一个原因,您可能需要实现不是基于异常的错误通知。您可能仍然有一个同步模型 - 客户端会打电话给您,并等待您的操作完成 - 然后您可以(也应该)使用事件通知主叫方操作无法完成。但是,你可能会区分“错误”和“轻度错误”。考虑以下情况:

客户端调用一个方法,您开始一个异步操作,但在某个时候开始等待它完成,例如,与Thread.JoinWaitHandle.WaitOne。当工作线程最终完成时,将结果返回给用户。您可以订阅来自底层框架的错误事件 - 但您可能将此错误标识为非致命错误,因此您可以决定继续等待后台线程完成,而不是抛出异常,但仍然通知用户有关错误(再次 - 只有在需要的时候,通常你可以通过简单的登录逃脱)。您可以通过事件或返回值(或ref/out参数)执行此操作。后者是更主流的方法 - 你只需要返回一个非致命错误列表,在大多数情况下,它将是空的,如果客户关心 - 他会重新列表。

这是非常多的,它主要取决于你的类库的接口 - 它是否同步,如果你分享更多的细节,你可以得到更具体的答案。

0

错误事件是应用程序逻辑。我不明白你为什么想要在图书馆里处理这些事件。

+0

如果我不处理错误事件,那么使用我的类库的客户端永远不会获得有关设备驱动程序中的任何此类错误的信息。 – gingo