当前位置:

首页 > 编程开发 > C++异常信息格式化输出方法

C++异常信息格式化输出方法

通过自定义异常类与宏结合实现结构化异常输出,包含文件、行号等信息,并利用fmt库或ostringstream进行格式化,结合全局捕获确保统一输出格式,提升调试效率与日志可读性。

本文目录

    通过自定义异常类与宏结合实现结构化异常输出,包含文件、行号等信息,并利用fmt库或ostringstream进行格式化,结合全局捕获确保统一输出格式,提升调试效率与日志可读性。

    C++如何实现异常信息格式化输出

    在C++中,异常信息的格式化输出可以通过结合标准异常类与字符串处理机制来实现。核心思路是捕获异常后,将异常信息按需组织成结构化或可读性强的格式输出,比如包含时间、异常类型、错误消息、文件位置等。

    使用std::exception派生类自定义异常

    通过继承std::exception或其派生类(如std::runtime_error),可以封装格式化的错误信息。

    示例:

    #include 
    #include 
    #include 
    #include 
    
    class FormattedException : public std::runtime_error {
    public:
        template
        FormattedException(const std::string& file, int line, const std::string& msg, Args... args)
            : std::runtime_error(formatMessage(file, line, msg, args...)) {}
    
    private:
        template
        static std::string formatMessage(const std::string& file, int line, const std::string& msg, Args... args) {
            std::ostringstream oss;
            oss << "[" << file << ":" << line << "] Error: " << msg;
            // 这里可以扩展参数格式化逻辑
            return oss.str();
        }
    };
    
    // 辅助宏,自动注入文件和行号
    #define THROW_FORMATTED(msg) \
        throw FormattedException(__FILE__, __LINE__, msg)
    

    结合宏实现便捷抛出

    使用宏可以自动记录抛出异常的位置,提升调试效率。

    用法示例:

    try {
        if (some_error) {
            THROW_FORMATTED("Failed to open file 'config.txt'");
        }
    } catch (const std::exception& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    

    输出可能为:

    [main.cpp:42] Error: Failed to open file 'config.txt'

    使用fmt库进行高级格式化

    若项目中使用了fmt库(如{fmt}或std::format in C++20),可实现更灵活的格式控制。

    示例(需包含fmt):

    #include 
    #include 
    #include 
    
    #define THROW_FMT(file, line, fmt_str, ...) \
        throw std::runtime_error(fmt::format("[{}:{}] {}", file, line, fmt::format(fmt_str, __VA_ARGS__)))
    
    // 使用
    // THROW_FMT(__FILE__, __LINE__, "Unable to connect to {} on port {}", host, port);
    

    全局异常捕获与统一输出

    在main函数中捕获所有异常,确保格式化输出一致。

    int main() {
        try {
            // 业务逻辑
        } catch (const std::exception& e) {
            std::cerr << "[EXCEPTION] " << e.what() << std::endl;
        } catch (...) {
            std::cerr << "[UNKNOWN EXCEPTION]" << std::endl;
        }
        return 0;
    }
    

    基本上就这些。通过自定义异常类、宏和格式化工具,能有效实现清晰、可追踪的异常信息输出。关键在于统一抛出方式和捕获处理,便于日志记录和调试。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    如何在 Go 模板生成代码时自动格式化输出(而非模板本身)
    如何在 Go 模板生成代码时自动格式化输出(而非模板本身)

    在Go模板生成代码时,应通过bytes.Buffer捕获模板执行结果,再调用go/format.Source格式化纯Go代码,避免直接格式化含模板指令的文件,以确保输出格式正确。

    怎么掌握 LocalDateTime 的格式化输出
    怎么掌握 LocalDateTime 的格式化输出

    掌握 LocalDateTime 的格式化输出,关键其实就在两件事上:用对 DateTimeFormatter,以及记牢 Pattern 字符的大小写含义。不用额外引入第三方库,Ja va 8 自带这套方案就已经足够原生、线程安全且语义清晰——这也是日常开发中绕不开的基础能力。 用对 DateTim

    C++ std::print与std::println _ C++23类型安全格式化输出【详解】
    C++ std::print与std::println _ C++23类型安全格式化输出【详解】

    C++23格式化输出新标杆:std::print与std::println详解 告别繁琐的std::cout和类型不安全的printf,std::print和std::println无疑是C++23中格式化输出的首选方案。它们安全、简洁,但前提是你的开发环境已经做好了迎接C++23的准备——否则,编

    怎么通过 ChoiceFormat 实现类似于“单数/复数”形式的动态文本格式化输出
    怎么通过 ChoiceFormat 实现类似于“单数/复数”形式的动态文本格式化输出

    怎么通过 ChoiceFormat 实现类似于“单复数”形式的动态文本格式化输出 ChoiceFormat 是什么,它适合做单复数吗 先说结论:它不适合。虽然 ChoiceFormat 能根据数值范围匹配字符串,比如“0 个|1 个|2 个以上”这种形式,但它本质上**不理解语言学上的单复数规则**

    怎么在 Java 中使用 String.format() 实现类似 C 语言的格式化输出
    怎么在 Java 中使用 String.format() 实现类似 C 语言的格式化输出

    怎么在 Ja va 中使用 String.format() 实现类似 C 语言的格式化输出 String.format() 的基本语法和占位符怎么写 很多从 C 语言转过来的开发者,会下意识地把 printf 那套写法直接搬到 Ja va 里。但这里有个关键区别:Ja va 的 String.for

    怎么利用 String.format() 格式化输出带百分号或千分位的数字字符串
    怎么利用 String.format() 格式化输出带百分号或千分位的数字字符串

    怎么利用 String.format() 格式化输出带百分号或千分位的数字字符串 百分号显示总被吃掉一个,怎么保留完整的 % 符号 相信不少开发者都踩过这个坑:在String.format()里,%符号是格式化的转义起始符。如果你直接写"%d%",程序会毫不犹豫地抛出一个UnknownFormatC

    AppDomain.CurrentDomain.UnhandledException的作用是捕获应用程序域中未处理的异常,常用于全局异常处理,确保程序在发生未预
    AppDomain.CurrentDomain.UnhandledException的作用是捕获应用程序域中未处理的异常,常用于全局异常处理,确保程序在发生未预

    使用AppDomain.CurrentDomain.UnhandledException只需订阅该事件并在事件处理程序中编写异常处理逻辑,如记录日志、清理资源并调用Environment.Exit优雅退出;2.try-catch用于处理可预测的局部异常,而UnhandledException作为全局防线捕获未被处理的异常,二者应结合使用,不可相互替代;3.在ASP.NETCore中应使用异常处理中间件实现全局异常处理,通过在请求管道中捕获异常并返回统一响应,相比AppDomain事件,中间件更契合Web应

    throw与throws区别详解
    throw与throws区别详解

    throw用于方法内抛出异常实例,throws用于声明方法可能抛出的异常类型。①throw后接异常对象,如newIllegalArgumentException();②throws后接异常类名,写在方法签名末尾;③throw主动抛出异常,中断执行流程;④throws提醒调用者处理检查型异常;⑤二者协同实现Java异常处理机制。

    Golang云原生异常处理与日志管理技巧
    Golang云原生异常处理与日志管理技巧

    云原生Golang应用需通过统一错误处理、结构化日志、上下文传递、链路追踪与监控告警实现高效可观测性。使用errors包封装带上下文的错误,保留堆栈信息;采用zap等库输出JSON格式日志,包含timestamp、level、service_name、trace_id等字段;结合context传递request_id和trace_id,在中间件中注入并记录;集成OpenTelemetry/Jaeger实现跨服务追踪,错误时标记span状态;通过Prometheus统计错误指标,Loki收集日志,Grafa

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。