C#调用第三方库方法时如何捕获其内部抛出的ApiKey无效异常
问题解决方案
核心原因
你调用的GetSummonerByNameAsync是异步方法,代码中没有使用await关键字等待异步逻辑执行完成,CheckAPIKEY方法会在异步请求还没返回结果时就直接返回true,异步逻辑抛出的异常脱离了当前try/catch的上下文范围,自然无法被捕获。你之前推测的「GetAppels内部try块优先级更高」是错误的:方法内部的try/finally不会阻断异常向上抛出,finally仅会在异常抛出前执行资源释放逻辑,执行完成后异常会正常向上传递。
修复代码
1. 修改CheckAPIKEY方法
将方法改为异步返回Task<bool>,添加await等待异步请求执行完成:
private async Task<bool> CheckAPIKEY(string key) { try { riotApi = RiotApi.GetDevelopmentInstance(key); // 等待异步方法执行完成,异常才会被当前try/catch捕获 await riotApi.Summoner.GetSummonerByNameAsync( region: RiotSharp.Misc.Region.Euw, summonerName: summonerName ); return true; } catch (RiotSharpException) { return false; } // 可选:添加通用异常捕获,避免网络错误等其他异常未被捕获 catch (Exception) { return false; } }
2. 修改Button_Click调用逻辑
按钮点击事件改为异步方法,添加await等待校验结果返回:
private async void Button_Click(object sender, RoutedEventArgs e) { if (gameIsRunning) { MessageBox.Show("程序已在运行中!"); return; } if (summonerName == null) { MessageBox.Show("无法获取召唤师名称信息,请确认是否已打开英雄联盟客户端?"); return; } KEY = Key.Text; bool keyIsValid = await CheckAPIKEY(KEY); if(!keyIsValid) { MessageBox.Show("你的Riot API密钥无效。"); } }
内容的提问来源于stack exchange,提问作者Sharki
相关产品推荐
相关产品推荐

