2

在我的自定义 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(). catch块中的代码被执行了,所以我知道异常已经被处理了。麻烦的是,Orchard 仍然显示未处理的异常行为。如何阻止异常冒泡,以便我的 RedirectToAction 会触发?

4

1 回答 1

2

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

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

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

于 2012-12-17T11:58:06.587 回答