我目前正在问自己一些关于异常处理和事件处理程序的问题,我希望你们中的一些人会给我一些帮助。
我将开始解释我想在c#应用程序中实现的目标:
我有一个顶级方法(让我们称之为main方法)。此方法调用异步方法(称为connect),该方法连接到FTP服务器。
EventHandler对象与此连接相关联,并且在连接成功时调用“callback”方法。
我想处理可在整个过程中启动的异常。所以我想在顶级方法中捕获它。它适用于connect方法启动的异常(在顶级方法中调用)。 但是,它不适用于在“回调”方法中调用的异常:顶级方法不会捕获它们并且执行失败。
我可以做些什么来使顶级方法捕获这些异常?我不想在回调中处理这些异常。
答案 0 :(得分:2)
看看Backgroundworker如何处理这个:Exception传播到Completed事件处理程序。
我假设您有某种形式的State对象传递给委托/从委托传递,您可以在这里添加这样的属性。而且你必须在最外层的范围内捕获线程中的所有异常。但“处理”只意味着传递它。
RunWorkerCompleted事件有一个标准模式,请参阅this MSDN page。
答案 1 :(得分:2)
考虑以下代码片段,将所有代码包装在全局异常处理程序中:
namespace MyClient
{
class Program
{
static void Main(string[] args)
{
try
{
bool isSuccess = SubMain(string[] args);
}
catch (Exception e)
{
HandleExceptionGracefully(e);
}
}
static bool SubMain(string[] agrs)
{
// Do something
}
static void HandleExceptionGracefully(Exception e)
{
// Display/Send the exception in a graceful manner to the user/admin.
}
}
}
另外,不要忘记进行错误处理user-friendly.
答案 2 :(得分:1)
Application类中有一个名为ThreadException的事件处理程序。每当抛出一个未在当前调用堆栈中的任何位置捕获的异常时,将触发此事件。
编辑:
抱歉,我误解了这个问题 - 我没有意识到您示例中的“主要”方法不是实际的 主 方法。在这种情况下,您可能希望在回调中捕获异常,但不处理它 - 而只是将其作为事件args的一部分传递回main方法。
Winforms中的BackgroundWorker做了类似的事情。
答案 3 :(得分:0)
感谢您的回答。
似乎使用BackgroundWorker解决了这个问题。
我没有尝试过,因为我选择避免这种实施负担。所以我拿走了我的异步调用并使我的应用程序同步运行。
使用Compact Framework而不是完整.NET Framework的人员的一个提示: BackgroundWorker在CF中不可用,但OpenNETCF提供了类似的解决方案(请参阅智能设备框架中的BackgroundWorker类)。
答案 4 :(得分:0)