C++程序里try-catch成功捕获了异常,却完全不知道异常是从哪一层代码抛出来的,接住了也没法定位根因,等于白接。不用逐行回溯全量调用链,几个简单方法就能拿到完整异常上下文。

1. 抛出时附带堆栈信息
自定义异常类,在构造函数里直接调用系统API获取当前调用栈。
抛出异常时就把完整的函数调用路径存下来,catch拿到异常后直接打印,立刻就能看到异常最初抛出的位置。
2. 按引用捕获异常
catch语句里用引用类型接收异常对象,不要用值捕获。
值捕获会触发对象切片,丢失自定义异常里的扩展信息,导致拿到的异常信息残缺,无法追溯原始抛出场景。
3. 捕获所有异常重抛
在最外层catch(...)块里,先打印当前线程的调用栈。
再用std::throw_with_nested把原始异常嵌套重抛,保留完整的异常链路,不会丢失中间层的调用信息。
4. 开启调试器异常中断
在GDB或IDE调试器里设置,异常抛出时立刻中断程序。
不用等异常被catch接住,直接停在抛出点,现场查看变量和调用栈,一秒定位异常源头。
本文凡亿教育原创文章,转载请注明来源!
暂无评论