【问题标题】:Handled Orchard exception still bubbling up处理的果园异常仍在冒泡
【发布时间】:2012-12-17 09:53:47
【问题描述】:

在我的自定义 Orchard 模块中,我在一个控制器操作中编写了一些 ftp 客户端代码,该操作恰好在登录期间引发自定义 FtpException。我已将登录代码包装在 try-catch 中,如果出现错误,我会向视图发送通知消息。问题是错误仍在冒泡并显示标准的“糟糕。出了点问题......对不起”Orchard 错误消息。这是我要包装的代码:

        try
        {
            ftpClient.Login();
            ftpClient.Upload(fileName);
        }
        catch (FtpException ex)
        {
            services.Notifier.Error(T("There was an error sending the file - {0}.", ex.Message));
            return RedirectToAction("Edit", "Project");
        }
        finally
        {
            ftpClient.Close();
        }

        services.Notifier.Information(T("File uploaded successfully."));
        return RedirectToAction("Edit", "Project");

如果我查看 Orchard 日志,我发现在 ftpClient.Login() 中引发了 FTP 异常。 catch块中的代码被执行了,所以我知道异常已经被处理了。麻烦的是,Orchard 仍然显示未处理的异常行为。如何阻止异常冒泡,以便触发我的 RedirectToAction?

【问题讨论】:

  • 抛出的异常肯定是 FtpException(或派生类型)吗?
  • 是的,但为了确保,我将 catch 块更改为 catch System.Exception - 结果是一样的
  • 好的,您是否尝试过单步执行以查看调用异常时会发生什么?是否有可能是 ftpClient.Login 抛出了一个异常,它被你的 catch 捕获了,然后 another 异常被最终尝试关闭已经关闭的 ftpClient 生成?
  • 啊 - 这可能是问题所在 - 虽然这段代码在本地工作并且只有在进入 Azure 时才会崩溃,所以很难说。 Orchard 日志将错误突出显示为登录调用而不是关闭调用。将尝试处理 finally 块并报告 - 谢谢
  • 太棒了——这正是问题所在。在 finally 块中抛出了另一个异常 - 如果您愿意将其转化为答案...

标签: asp.net-mvc error-handling orchardcms


【解决方案1】:

正如 cmets 中所讨论的,可能会发生以下情况:

  1. 执行进入try,调用Login(),抛出异常。
  2. 执行跳转到您的 catch 块,该块尝试在您的 ftpClient 对象上调用 Close()
  3. 我不确定ftpClient 的确切类型,但是在不一定打开的实例上调用Close() 是有道理的(首先通过Login)会引发另一个异常, Orchard 的异常处理程序正在捕获它。

我会首先在 FTP 客户端类中查找(或添加)某种 IsOpen 属性,或者将 Login 调用包装在单独的 try/catch 中,以便区分登录失败和另一个失败。或者,如果您可以访问源代码,则可以让 Login 在失败时抛出不同类型的异常。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2011-09-01
    • 2014-05-23
    • 2011-05-13
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多