Python报错: Unhandled exception in thread started by Error in sys.excepthook

本文介绍了一个Python多线程程序中出现的问题及解决方案。主要讨论了如何避免因主线程提前退出导致子线程异常终止的情况,通过使用锁和循环检测来确保所有子线程正常完成。
部署运行你感兴趣的模型镜像

今天要写个简单脚本,模拟同时50个用户往服务器上传东西。

就简单用

thread.start_new_thread(func, ())

结果运行的时候报错:

Unhandled exception in thread started by 
Error in sys.excepthook: 
Original exception was:

想了一下,原来是子线程还没退出,主线程就退出了,需要确保主线程等待所有子线程退出后再退出,如果主线程比子线程早结束,子线程就会中断,抛出这个异常。简单加个sleep,就没有报错了,当然,比较好的方法是给每个线程都加了一把锁,直到线程运行结束,再释放这个锁。同时在Python的main线程中用一个while循环来不停的判断每个线程锁已释放

 locks=[];    
 for i in range(len(seconds)) :    
     lock=thread.allocate_lock();    
     lock.acquire();    
     locks.append(lock);   

启动线程的时候把锁传进去:

 thread.start_new_thread(loop,(function,(),lock));
在线程函数里面使用

lock.release(); 

在主线程里面使用while循环来检测锁是否都释放了

for lock in locks :    
    while lock.locked() :     
        pass;


OK,这样就搞定了。





您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

你指出的问题非常关键: > ❌ `Unhandled exception: com.amap.api.services.core.AMapException` 这是因为 **高德 SDK 的 `searchPOIAsyn()` 方法虽然异步执行,但它在构造或调用时仍可能抛出 `AMapException`**。 尽管是异步方法,但在初始化 `PoiSearch` 对象或传参错误时仍需捕获异常。 --- ## ✅ 正确做法 所有 `new PoiSearch(...)` + `searchPOIAsyn()` 的地方都必须包裹在 `try-catch (AMapException e)` 中。 我们来 **逐一修复三处代码中的报错点**,并确保: - ✅ 捕获 `AMapException` - ✅ 不崩溃、有降级处理 - ✅ 保持逻辑清晰 --- ### ✅ 1. 修复 `RealTimePoiSuggestHelper.java` 中的 nearby 搜索部分 #### 🔧 修改位置:`onPoiSearched()` 内部发起 `nearbySearch.searchPOIAsyn()` ```java try { nearbySearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() { @Override public void onPoiSearched(PoiResult res, int code) { if (code == 1000 && res != null && res.getPois() != null && !res.getPois().isEmpty()) { List<String> sortedNames = sortByDistance(res.getPois(), lat, lng) .stream().map(PoiItem::getTitle).collect(Collectors.toList()); notifySuccess(sortedNames.toArray(new String[0])); } else { // fallback List<String> fallback = sortByDistance(rawList, lat, lng) .stream().map(PoiItem::getTitle).collect(Collectors.toList()); notifySuccess(fallback.toArray(new String[0])); } } @Override public void onPoiItemSearched(PoiItem item, int rCode) {} }); // ✅ 包裹在 try-catch 中 nearbySearch.searchPOIAsyn(); } catch (com.amap.api.services.core.AMapException e) { e.printStackTrace(); // fallback 排序原始结果 List<String> fallback = sortByDistance(rawList, lat, lng) .stream().map(PoiItem::getTitle).collect(Collectors.toList()); notifySuccess(fallback.toArray(new String[0])); } ``` --- ### ✅ 2. 修复 `MapFragment.java` 中的 `doSearch()` 和二次 nearby 请求 #### 🔧 原始 `doSearch()` 方法(首次搜索) ```java private void doSearch(String keyword) { if (keyword.isEmpty()) return; PoiSearch.Query query = new PoiSearch.Query(keyword, "", currentCity); query.setPageSize(20); query.setPageNum(0); try { poiSearch = new PoiSearch(requireContext(), query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); // 可能抛出 AMapException } catch (com.amap.api.services.core.AMapException e) { e.printStackTrace(); Toast.makeText(requireContext(), "搜索失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); binding.emptyView.setText("⚠️ 搜索失败"); binding.emptyView.setVisibility(View.VISIBLE); binding.resultList.setVisibility(View.GONE); } } ``` #### 🔧 在 `onPoiSearched()` 中发起 nearby 请求的部分也要加 try-catch ```java try { nearbySearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() { @Override public void onPoiSearched(PoiResult res, int code) { if (code == 1000 && res != null && res.getPois() != null && !res.getPois().isEmpty()) { List<PoiItem> sorted = sortByDistance(res.getPois(), myCurrentLat, myCurrentLng); updateResultList(sorted); } else { List<PoiItem> fallback = sortByDistance(rawList, myCurrentLat, myCurrentLng); updateResultList(fallback); } } @Override public void onPoiItemSearched(PoiItem item, int rCode) {} }); // ✅ 异步请求也可能抛异常! nearbySearch.searchPOIAsyn(); } catch (com.amap.api.services.core.AMapException e) { e.printStackTrace(); // 降级:对原始列表按距离排序 List<PoiItem> fallback = sortByDistance(rawList, myCurrentLat, myCurrentLng); updateResultList(fallback); } ``` --- ### ✅ 3. 修复 `SearchResultActivity.java` 中的 nearby 请求 同理,在 `onPoiSearched()` 里添加 try-catch: ```java try { nearbySearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() { @Override public void onPoiSearched(PoiResult res, int code) { if (code == 1000 && res != null && res.getPois() != null && !res.getPois().isEmpty()) { List<PoiItem> sorted = sortByDistance(res.getPois(), myCurrentLat, myCurrentLng); updateResultList(sorted); } else { List<PoiItem> fallback = sortByDistance(rawList, myCurrentLat, myCurrentLng); updateResultList(fallback); } } @Override public void onPoiItemSearched(PoiItem item, int rCode) {} }); nearbySearch.searchPOIAsyn(); // ← 可能抛异常 } catch (com.amap.api.services.core.AMapException e) { e.printStackTrace(); List<PoiItem> fallback = sortByDistance(rawList, myCurrentLat, myCurrentLng); updateResultList(fallback); } ``` 同时修改 `performSearch()` 中的主请求: ```java private void performSearch(String keyword) { emptyView.setText("🔍 搜索中..."); emptyView.setVisibility(View.VISIBLE); resultListView.setVisibility(View.GONE); PoiSearch.Query query = new PoiSearch.Query(keyword, "", currentCity); query.setPageSize(20); query.setPageNum(0); try { poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); } catch (com.amap.api.services.core.AMapException e) { e.printStackTrace(); Toast.makeText(this, "搜索请求失败", Toast.LENGTH_SHORT).show(); emptyView.setText("⚠️ 请求异常"); emptyView.setVisibility(View.VISIBLE); resultListView.setVisibility(View.GONE); } } ``` --- ## ✅ 总结:为什么会出现这个异常? | 原因 | 说明 | |------|------| | `AMapException` 是 checked exception | Java 要求必须显式捕获 | | 即使是 `.searchPOIAsyn()` | 构造阶段就可能因参数错误抛出异常 | | 常见触发场景 | 空 context、非法城市名、权限缺失等 | --- ## ✅ 最佳实践建议 ✅ 所有涉及高德服务创建和异步调用的地方都要这样写: ```java try { PoiSearch search = new PoiSearch(context, query); search.setOnPoiSearchListener(listener); search.searchPOIAsyn(); } catch (AMapException e) { Log.e("PoiSearch", "Failed to initiate search", e); // 降级策略:提示用户 / 使用缓存 / fallback 排序 } ``` --- ## ✅ 当前已解决 你现在应该已经: - ✅ 消除了所有 `Unhandled exception: com.amap.api.services.core.AMapException` - ✅ 加了健壮的异常处理 - ✅ 保证了 UI 不崩溃、有 fallback 行为 --- ##
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值