在Visual Studio C#中发起Ping请求触发未处理异常如何解决
问题根因
你触发全局未处理异常中断的核心原因是Button_Click方法内的代码运行出错且没有做异常捕获,错误主要来自以下几个地方:
- 错误获取输入框内容:你代码里的
ip_address是XAML里的输入框控件,直接调用ToString()得到的是控件类型字符串,不是用户输入的IP地址,传入Ping.Send方法直接触发参数非法异常 - 缺少异常捕获逻辑:
Ping.Send方法本身会在目标不可达、参数非法、网络无权限等场景下抛出异常,你没有用try-catch包裹,所以异常向上抛到全局触发中断 - 缺少网络权限:UWP应用默认没有互联网访问权限,调用Ping操作会被系统拦截抛出异常
- 同步操作阻塞UI:
Ping.Send是同步方法,执行时会阻塞UI线程,也可能触发运行时异常
修复步骤
- 第一步:修改IP地址获取逻辑,取输入框的
Text属性而不是直接调用ToString - 第二步:给Ping操作加try-catch异常捕获,处理所有可能的报错情况
- 第三步:打开UWP项目的
Package.appxmanifest文件,在「功能」标签页里勾选「Internet(客户端)」权限 - 第四步:可选优化:改成异步Ping避免阻塞UI,使用体验更好
修改后的参考代码
private async void Button_Click(object sender, RoutedEventArgs e) { // 先校验输入是否为空 if(string.IsNullOrWhiteSpace(ip_address.Text)) { status_info.Text = "请输入要Ping的IP地址 - " + DateTime.Now.ToLocalTime(); return; } Ping pingsender = new Ping(); try { // 用异步方法避免阻塞UI PingReply reply = await pingsender.SendPingAsync(ip_address.Text.Trim()); if (reply.Status == IPStatus.Success) { status_info.Text = "成功! - " + DateTime.Now.ToLocalTime(); } else { status_info.Text = $"失败,状态:{reply.Status} - " + DateTime.Now.ToLocalTime(); } } catch (Exception ex) { // 捕获所有异常,显示错误信息方便排查 status_info.Text = $"操作出错:{ex.Message} - " + DateTime.Now.ToLocalTime(); } }
VS调试小技巧
后续遇到跳转到App.g.i.cs的情况时,可以在调试模式下查看局部变量窗口里的异常参数e,它的Message属性就是具体的异常原因,可以直接定位问题。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

