错误处理:引发事件或手动抛出异常

时间:2014-02-20 14:33:12

标签: c# vb.net exception-handling

我有一个我正在编写的课程,它基本上用于将交易发送到信用卡处理器。

作为一项保护措施,我会做一些检查以验证传递给函数的属性,我的问题是如果我发现错误,说明一个空白或无效的信用卡号,我应该提出一个自定义事件并强制执行任何操作调用函数来处理自定义事件以处理异常,或者我应该throw一个新的异常,并假设无论什么调用我的类都有自己的尝试和捕获来处理异常?

我很好奇哪个更有效,但更关心手动使用throw关键字的公认标准。

3 个答案:

答案 0 :(得分:2)

无法强制调用者注册事件,因此如果您通过事件处理此事件,则消费者可能会忽略该问题。如果它应该是阻塞问题,请使用例外。

从效率的角度来看,抛出(更具体地说是捕获)异常会产生开销,但如果您处于无法发生任何事情的情况,那么这确实是一种例外情况。另外,请考虑在开发过程中包含Trace.Assert以帮助调试。

答案 1 :(得分:1)

你最好的选择是提出异常。这将迫使程序必须明确地处理问题,而不是依赖开发人员来注册处理程序。

异常也意味着您可以更接近可以处理它的代码处理错误。例如,您的事务处理器可能深埋在调用堆栈中,但它实际上是您的GUI层,而不是通过显示消息来处理错误。使用事件方法,您将无法将gui附加到事务处理器,因为它无法访问它,但使用异常方法可以处理其错误。

答案 2 :(得分:0)

如果验证失败,则不是“事件”。

我建议您执行以下操作:

1 - 添加一个名为ValidateDetails

的布尔返回方法

2 - 如果在您尝试处理信息时验证失败,则抛出异常(您可以自己使用ValidateDetails方法来检查)

这将允许开发人员在发送它们以进行处理和接收异常之前执行他们自己的检查,表明他们已经提供了正确的信息。

Public Class CreditCardProcessor
    Public Function ValidateDetails As Boolean
        'check everything validates here and return True/False accoringly
    End Function

    Public Sub ProcessDetails
        If Not ValidateDetails Then
            Throw New Exception("Validation failed")
            Exit sub
        End If
        'Process the credit card here
    End Sub
End Class