在我的自定义 Orchard 模块中,我在 Controller 操作中编写了一些 ftp 客户端代码,这些代码在登录期间恰好抛出自定义 FtpException。我已将登录代码包装在 try-catch 中,如果出现错误,则会将通知消息发送回 View 。问题是错误仍在冒泡,并显示标准的“哎呀。出了问题......抱歉”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 block 中的代码被执行,因此我知道异常已被处理。问题是,Orchard 仍然显示未处理的异常行为。如何阻止异常冒泡以便我的 RedirectToAction 触发?
最佳答案
正如评论中所讨论的,可能会发生以下情况:
- 执行进入
try
,并调用Login()
,并抛出异常。 - 执行跳转到您的 catch block ,该 block 尝试在您的
ftpClient
对象上调用Close()
。 - 我不确定
ftpClient
的确切类型,但在不一定已打开的实例上调用Close()
是有意义的(通过Login
)会抛出另一个异常,而 Orchard 的异常处理程序正在捕获该异常。
我首先会在 FTP 客户端类中查找(或添加)某种 IsOpen
属性,或者将 Login
调用包装在单独的 try/中catch 以便您可以区分登录失败和其他失败。或者,如果您有权访问源代码,则可以使用 Login
在失败时抛出不同类型的异常。
关于asp.net-mvc - 已处理的 Orchard 异常仍在冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911799/