异常如何突破try\catch块?

发布于 2024-09-25 20:53:13 字数 199 浏览 6 评论 0原文

摘自《单元测试的艺术》一书:

在Rhino Mocks中,严格的mock是通过调用StrictMock创建的 方法。意外的方法调用异常总会被抛出, 即使您的测试包含您认为的全局 try-catch 子句 会捕获从隔离框架抛出的此类异常。

那么我到底如何在自己的程序中实现这种行为呢?

A citation from "The art of unit testing" book:

In Rhino Mocks, strict mocks are created by calling the StrictMock
method. Unexpected method call exceptions will always be thrown,
even if your test contains a global try-catch clause, which you’d think
would catch such an exception thrown from the isolation framework.

So how exactly can I implement this behaviour in the program of my own?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

疯了 2024-10-02 20:53:14

您的应用程序中永远不应该出现这种类型的场景,因为您不应该捕获全局异常。您应该只捕获要处理的异常类型,其他所有内容都应该允许冒泡。

You should never really have this type of scenario in your application as you shouldn't be catching global exceptions. You should only catch the type of exceptions you are going to handle, everything else should be allowed to bubble up.

陌上青苔 2024-10-02 20:53:14

一种方法可能是实现拦截框架,例如Unity.Interception(也存在其他框架,例如来自Castle)。

使用Unity.Interception你可以编写一个ICallHandler的实现,它有一个Invoke方法,你可以在其中捕获和重新抛出异常:

public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
    var methodReturn = getNext().Invoke(input, getNext);

    // did the method raise an exception?
    if (methodReturn.Exception != null)
    {
        // handle it... re-throw it if necessary...
    }
}

当然深入研究Rhino的源代码.Mocks 将是最直接的方法。至少,使用 Reflector 并浏览 dll。

One way might be to implement an interception framework, such as Unity.Interception (others also exists, e.g. from Castle).

Using Unity.Interception you can write an implementation of ICallHandler, which has an Invoke method where you can trap and re-throw exceptions:

public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
    var methodReturn = getNext().Invoke(input, getNext);

    // did the method raise an exception?
    if (methodReturn.Exception != null)
    {
        // handle it... re-throw it if necessary...
    }
}

Of course delving into the source code of Rhino.Mocks would be the most direct way to do this. At the very least, use Reflector and browse the dll.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文