我正在构建一个C#windows窗体应用程序,它按名称ping多台计算机,用户可以指定。
我正在使用System.Net.NetworkInformation.Ping类和SendAsync方法,并使用一种方法来处理结果。
当用户指定不存在的计算机名时,会出现我遇到的问题。但是,不是Ping将错误返回给我的回调方法,而是在Application.Run(new Form())(整个表单的主要方法)中得到一个TargetInvocationException。我尝试使用try / catch包围相关代码,但它们似乎永远不会捕获异常
以下是ping的相关代码:
Ping p = null;
try
{
p = new Ping();
p.PingCompleted += new PingCompletedEventHandler (updateUI);
p.SendAsync(computername, 10, computername);
}
catch (Exception)
{
((IDisposable)p).Dispose();
MessageBox.Show("Ping Failed...");
}
答案 0 :(得分:3)
首先在PingCompleted事件处理程序中检查e.Error属性。当它不为null时,尝试使用其他属性是保证kaboom。从MSDN中的PingCompletedEventArgs.Error属性文档:
如果在异步操作期间引发异常,该类将为Error属性分配异常。客户端应用程序的事件处理程序委托应该在访问从AsyncCompletedEventArgs派生的类中的任何属性之前检查Error属性。否则,该属性将引发 TargetInvocationException ,其InnerException属性包含对Error的引用。
答案 1 :(得分:-1)
因为您的异常处理程序没有被命中,所以它必须位于代码中发生错误的其他部分。