对异常处理的一点思考

最近在网上看了一些文章,关于处理异常的。

1, 对异常处理的三个原则,具体,早抛,晚处理, ( http://today.java.net/pub/a/today/2003/12/04/exceptions.html

2, 使用错误代号

( http://www-106.ibm.com/developerworks/java/library/j-ejbexcept.html )

3, 使用运行时异常

( http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html )

这三个原则是很有道理的。

1, 在一些书上说,异常要早处理,因为 VM 维护异常栈,要浪费性能。但异常之所以为异常,发生的频率应该不高。早处理的问题是,基本处理不了。因为目前常见的处理异常方式,日志 + 消息,日志可以底层记录,但消息却只能在高层处理。

2, 使用错误代号 , 这一点很有趣,让人联想 MS 的某某错误代号。使用代号,有利于维护一个异常库,国际化也比较方便一点。

3, 使用运行时异常,有利于代码封装,其实比较危险,但我们却可以限制它使用的范围来降低风险。

下面要讨论的处理异常方法就是基于以上三点的。同时我们假设系统是层次分明的,如果系统层次都不分明,讨论异常处理是没有意义的。以下是一个简单的架构分层结构 (Service proxy, BU, Util) ,初始化和请求过程。

 

 

 

1, 首先我们对异常分类。以引发原因异常可以分为内部异常 ( 系统内 ) 和外部异常。内部异常主要是开发过程中不太可能发生的异常和系统维护配置出错导致的异常,比如 ResourceLoader 读取配置文件失败,配置文件的 XML 格式不对, ElementProcessor 解析验证失败。这一类异常通常都是 Fatal 的。 外部异常主要是不恰当的用户调用,网络不可达等。比如用户输入格式不对,数据库服务器无法连接。

2, 根据系统的层次,为每一层新建相应的异常。这里的层次,更有一点功能内聚的模块的意思。不管是业务的还是底层 Util 的,每一层最好只有一个异常类。

4, 穷举系统内的异常。为这些异常在相应模块异常上新建或归入某一个错误代码中。这一步是随着系统开发迭代。 我们以 ResourceLoader 来详细说明一下。

对于 loadPlainResource() 方法来说,内部可能有的异常包括了 FileNotFoundException, IOException, 对于 loadXmlResource() 因为其返回为 Document ,所以还有关于 JAXPJDOM 的异常。

ResourceException

Code

Message

RESOURCE_NOT_FOUND

001

File not found

RESOURCE_READ_FAILED

002

Read file failed

RESOURCE_INVALID_FORMAT

003

XML format not right

随着开发的向前推进,会不断有新的异常加入到这张表。 我们同时还要处理的是高层的异常转译,比如 ResourceException3 个异常类可能只对应 BusinessException 中的一个映射,资源不可达 ESOURCE_UNREACHABLE 层次越高,异常越可读。

基于上面的异常类,我们可以定义如下的处理规则。

1, Service 层,抛 BusinessException 。因为只有更上层的才有能力处理异常, 把异常信息返回给客户。

2, BU, 只抛 ( 具体的 )BusinessException 。对于底层的异常,补获,转译 , 抛出。

3, Util 层,统一转译异常。

2 的解释,取决于模块间的调用,究竟能不能控制在 Service 层。如果在 BU 层调用其它的 Service 那就只能把抛出的异常放开到 BusinessException 了。

 

写完了,连自己都很乱.

下周SCJP后,再改

 

 

<think>好的,我现在需要回答用户关于在Linux环境下使用Qt进行异常捕获的最佳实践和方法的问题。首先,我需要回忆一下Qt的异常处理机制。Qt本身是基于C++的,所以在处理异常时,应该遵循C++的异常处理方式,即try-catch块。不过,Qt的一些机制可能和标准C++有所不同,需要注意。 用户提到的是在Linux环境下使用Qt,所以可能还需要考虑平台相关的异常处理,比如信号处理,比如SIGSEGV等信号的处理。但用户的问题主要集中在异常捕获,也就是C++的异常处理,所以可能需要先明确这一点。 接下来,我需要思考Qt中的异常处理是否有什么特别之处。例如,Qt的事件循环中抛出的异常是否会被正确处理?比如,在信号和槽的连接中,如果在槽函数中抛出异常,是否会导致程序崩溃?这时候可能需要使用Qt的事件循环机制来处理异常,或者使用QException类。 另外,用户可能想知道如何自定义异常类,以及在多线程环境下如何处理异常。比如,在Qt中,子线程抛出的异常是否能够传递到主线程,还是需要在线程内部处理? 现在需要整理出几个关键点: 1. 基本的try-catch块使用:在可能抛出异常的代码周围使用try块,并用catch捕获异常。例如,在文件操作或网络请求时可能会抛出异常。 2. Qt中的异常安全:Qt的大部分代码是否是异常安全的?例如,文档中可能提到某些函数可能会抛出异常,或者推荐使用错误码而不是异常。需要指出Qt推荐使用异常的情况,或者不推荐的地方。 3. 跨线程异常处理:在Qt的多线程编程中,如果工作线程抛出异常,主线程如何捕获?可能需要使用Qt的信号槽机制来传递错误信息,或者在线程内部捕获异常并发出信号。 4. 自定义异常类:如何继承QException或std::exception来创建自定义异常,以便更好地管理错误类型。 5. 资源管理:使用RAII(资源获取即初始化)原则,确保在异常发生时资源能够正确释放,比如使用智能指针或Qt的容器类。 6. 信号处理与异常的结合:在Linux下,可能需要处理底层信号(如SIGSEGV),但如何与C++异常结合?通常信号处理函数不能直接抛出异常,但可以通过设置信号处理函数,然后在信号处理中设置标志,之后在适当的地方检查并抛出异常。 然后,我需要考虑用户可能的实际应用场景。例如,在GUI程序中,异常如果没有被捕获,会导致程序崩溃,用户体验差。因此,异常处理在Qt GUI应用中尤为重要。需要建议在何处进行异常处理,比如在事件处理器、后台线程等。 可能还需要提到Qt的一些工具或类,比如QDebug用于记录错误信息,QMessageBox用于显示错误信息给用户,或者使用Qt的日志系统。 另外,需要注意Qt的异常处理与C++标准库的兼容性。例如,如果在Qt代码中使用STL容器,当它们抛出异常时,需要正确捕获。 可能的问题点:在跨线程的情况下,异常无法跨线程传播,因此必须在每个线程内部处理异常。例如,在工作线程中使用try-catch块,捕获异常后通过信号通知主线程错误信息。 还需要提到异常安全性的问题,比如在编写Qt类时,确保在异常发生时不会泄露资源,例如使用智能指针管理QObject的子对象,或者正确释放资源。 现在,我需要组织这些思路,形成结构清晰的回答,包括步骤、代码示例以及注意事项。同时,根据用户提供的引用内容,引用[1]提到了自定义异常类和捕获std::runtime_error的例子,引用[2]可能和查询优化有关,但不太相关,所以可能只需要引用[1]。 最后,生成相关问题,比如关于多线程异常处理、自定义异常类、Qt异常安全性等。</think>### Linux QT异常处理最佳实践与方法 在Linux环境下使用Qt进行异常处理时,需结合C++标准异常机制与Qt框架特性。以下是关键步骤与实践建议: --- #### **1. 基本try-catch机制** 在可能抛出异常的代码块中使用`try-catch`捕获异常: ```cpp try { // 可能抛出异常的代码,如文件操作 QFile file("data.txt"); if (!file.open(QIODevice::ReadOnly)) { throw std::runtime_error("文件打开失败"); } } catch (const std::exception& e) { qDebug() << "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值