使用异常和返回值,Exception and Error dispose

WinForm之海康面阵相机SDK的异常处理与设备重连机制 本文详细介绍了WinForm开发中海康面阵相机SDK的异常处理与设备重连机制。通过分析常见异常场景如MV_EXCEPTION_DEV_DISCONNECT等,提供了回调函数注册、智能重连策略及资源管理等解决方案,帮助开发者提升工业视觉系统的稳定性和可靠性。 阅读详情

转自:http://blog.youkuaiyun.com/zdl1016/archive/2007/06/27/1668622.aspx

 

使用异常和返回值

 

1.使用返回值处理错误需要程序员严格的编程作风,程序员不论是否有这种习惯,这都是非常不希望的。

 

2.正确的异常处理是C++中的一个常识。异常通过发出错误信号,可以让程序代码和错误处理代码分开,而且不会让程序忽略错误。

 

3.必须了解使用了哪种错误处理方法,返回值还是抛出异常。如果不知道,那么你的程序肯定有问题。

 

4.异常是基于每个线程而提出并处理的;异常不能被线程忽略,必须被处理;未处理的异常会使进程结束,而不仅仅是线程结束;异常处理在释放栈时会释放所有的栈对象,因此避免了资源的漏洞;异常处理需要大量的额外操作,使得它并不适于经常运行的代码。详细的说,catch块有一些开销(overhead),但是try块有很少的开销;因此只有在抛出异常的时候才会有很多的异常操作开销;你可以抛出任何类型的异常对象,但不包括整数。

 

5.返回值可以指示正常和不正常的函数运行,但不能阻止线程的继续运行;返回值很容易被忽略;返回值在典型的情况下是一个整数,通常映射符合于一个预定义的值;返回值能高效的传递和接收;

 

6.所有的非错误的状态信息都应该使用返回值

 

7.返回值用于大多数情况下可以随意忽略而不会出现问题的错误

 

8.在循环中的错误处理必须快速,因为异常的额外开销,所以为了得到更好的性能,使用返回值是一个更好的选择。在这种情况下,如果你真要使用异常,可以创建一个函数来将返回值转化为异常。

 

9.使用于中间语言模块中的错误。

 

10.使用Windows API的错误处理机制。用SetLastError设置错误代码,通过GetLastError检测这个错误代码。

 

11.从C++异常处理的观点看,故障应该被认为是错误。

 

12.你必须使用/Eha调试器选项来扑获使用C++异常操作机制的操作系统异常。

 

14.Windows结构异常处理:使用_try,_except,_finally,_leave关键字和RaiseException API函数;由Windows支持,不适于其他操作系统;不处理C++对象的解析;作为硬件异常或操作系统异常的结果抛出,也可作为RaiseException函数结果被抛出。

 

15.C++异常处理:使用try,throw和catch等关键字;仅被C++语言支持;处理C++对象的解析;可以抛出任何类型的C++对象。异常对象可以从标准的异常基本类派生,也可以从任何类派生,或者它们也可以是内置的类型;作为throw语句的结果被抛出。

 

16.Visual C++ 使用结构异常处理机制实现C++异常。

 

17.结构异常处理不能处理对象的解析,因此你应该在C++程序中一直使用C++异常。然而,因为C++异常不能处理硬件和操作系统异常,你的程序需要将结构异常转化为C++异常。

 

18.为了正确处理硬件和操作系统异常,你可以创建自己的异常类并使用_set_se_translator函数安装一个结构异常向C++异常的转化器。

 

19.不要扑获那些不能恢复所产生问题的转化后的结构异常。

 

20.在很少抛出异常的情况下使用异常的代价并不是很大,而且这样做确实可以提高性能。
 (我加一条,在可能有种种出错的可能下,但又不能明确的知道出错在哪里时,可以抛出异常)

 

21.异常策略中最重要的一部分实际上就是有一个策略。不要在事后弥补。

 

22.异常扑获规则:扑获处理器按顺序提供;如果扑获处理器扑获了同一类型或指向同一类型抛出对象的指针,则应扑获异常。如果扑获处理器扑获了一个公共基类或者指向一个公共基类抛出对象的指针,则应扑获异常;一个省略扑获处理器扑获任何类型的异常,因此它总是放在最后。

 

23.定义一个异常基类来处理程序代码抛出的异常。
class CProgramException : public exception {
public:
 CProgramException (const _exString &_what_arg) :
   exception(_what_arg) {}
};
使用CProgramException类使得异常处理更加简单,因为可以通过处理这种基类扑获所有的程序中的异常。如果需要的话,也可以使用额外的成员数据全面描述特定的问题。

 

24.使用auto_ptr或者一个类似的指针类通过限制局部变量的动态分配来自动释放资源:
void LeakFreeFunction (int arg) {
 auto_ptr<CMyObject> pObject(new CMyObject(arg));
 ... // do something that throws an exception
  // can still call member functions as normal
  pObject->MemberFunction();
 // no need to delete pObject
}
注意:auto_ptr仅在使用delete释放资源时使用。

 

25.使用异常处理更简单,更可靠,更有效,可以创建更健壮的代码。然而,你应该只在意外的情况下使用异常处理。如果你认为一个指针应该时空值,这种条件下就直接在代码中检查这个值,而不要使用异常。

 

26.非MFC的C++异常应该通过引用来扑获。使用引用扑获异常不需要删除异常对象(因为使用引用扑获的异常会在栈中传送),而且它保留了多态性(因此你扑获的异常对象正是你抛出的异常对象)。使用指针扑获异常需要你删除对象,而使用值扑获对象会导致对象的“分片”(slicing),也就是说,将派生的异常对象转化为扑获的数据类型。

 

27.MFC异常应该通过指针来扑获。因为它们通常从堆中分配,当你处理完异常之后,你需要调用Delete成员函数:
...
catch (CFileException *e) {
 // handle file exception
 ...
  e->Delete(); // required to prevent a memory leak
}
因此,你不可以使用省略扑获处理器扑获MFC异常,因为者会导致一个内存泄漏。你必须使用Delete成员函数删除MFC异常,而不要用delete操作符,因为一些MFC异常作为静态对象创建。

 

28.一旦扑获了异常,你可以通过执行下列典型动作的一些组合来处理它:
(1) 什么也不要做。
(2) 修改这个问题并重试代码。
(3) 修改这个问题但不要重试代码。
(4) 如果用户需要的话,向用户显示错误信息。
(5) 如果出现的问题不是程序错误的话,输出一个诊断的跟踪消息。
(6) 如果出现的问题是程序错误,输出一个断言。
(7) 在日志文件中记录这个问题。
(8) 如果异常是不可恢复的,停止进程的运行。
(9) 整理已分配的资源。
(10) 重新抛出这个异常,使得高级函数也能处理这个异常,特别是在当前函数不能完全解决的情况下。你可以重新抛出同一个异常对象,或抛出一个新的异常对象。

 

29.和/EHa相对的是同步异常(/EHs),而不是/GX。/GX实际上是/EHsc的简化形式。/GX表示编译器应该假设extern "C" 的函数不抛出C++异常,而/EHs则抛出。

 

30.为用户和调用环境记录异常。通常,异常对象类型用于向调用环境通知出现的问题,而问题的描述字符串用于向用户通知。

 

31.Visual C++的默认情况下,new和malloc对于错误不会抛出异常,但你可以通过使用_set_new_handler安装一个处理器,让new针对错误抛出异常。你也可以让malloc通过调用_set_new_mode使用同一处理器。
#include <new.h>
class bad_alloc : public exception {
public:
 bad_alloc(const __exString& what_arg) : exception (what_arg) {}
};
int NewHandler (size_t size) {
 throw bad_alloc("Operator new couldn't allocate memory");
 return 0;
}
int APIENTRY WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,
       LPSTR lpCmdLine,int nCmdShow) {
        _set_new_handler(NewHandler);
        _set_new_mode(1);   // use NewHandler for malloc as well
        ...
       }

 

32.如果已存在的代码中没有设定new返回空值,那么你应该始终让new出错时抛出一个异常。

 

33.浮点数和整数不一样,在默认情况下它被零除不会出现异常,但是会出现一个非常奇怪的值"1.#INFO" (它表示这个值并不是一个数字)。要让检测浮点数问题更简单一些,你应该用如下的代码让浮点数错误抛出异常。

#include <float.h>
 int cw=controlfp(0,0);
 cw &= ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE | EM_DENORMAL | EM_INVALID);
 _controlfp(cw, MCW_EM);
  浮点数异常处理器必须调用_clearfp作为它的第一条指令来清空浮点数异常。  

波动性GARCH模型与波动率预测(代码+结果分析) 本文介绍的ARCH、GARCH模型可以刻画出随时间变化的条件异方差。 阅读详情

相关推荐

4D毫米波雷达

详解4D成像毫米波雷达

sangba2019的博客 2394

C++之异常处理

为什么引入异常 在C语言中错误的处理,通常采用返回值的方式或是使用全局变量的方式。这就存在两个问题,一是如果返回值正是我们需要的数据,这就导致了返回数据同出错数据容错差不高。 二是全局变量,在多线程中易引发竞争,而且,当错误发生时,上级函数要出错处理,层层上报,造成过多的出错处理代码,且传递的效率低下。 因此C++引入了面向对象级别的异常处理机制。 在C++中异常的处理和具体逻辑的处理不比在同一个函数中,这样就可以做到底层逻辑专注于功能的实现,具体错误处理交由上层业务逻辑去处理。 异常如何使用? 使用关键字

u012944685的专栏 3423

论文阅读:Universal and Transferable Adversarial Attacks on Aligned Language Models. LLM Attacks

因为“即开即用”的大型语言模型能够生成大量令人反感的内容,近期的工作集中在对这些模型进行对齐,以防止不受欢迎的生成。尽管在规避这些措施方面取得了一些成功——即所谓的针对大型语言模型(LLMs)的“越狱”——这些攻击需要大量的人类智慧,并且在实践中很脆弱。自动对抗性提示生成的尝试也取得了有限的成功。在本文中,我们提出了一种简单有效的攻击方法,可以导致对齐的语言模型生成令人反感的行为。

CSPhD-winston的博客 1418

用C++ 而不是 用c (4)使用异常和返回值

使用异常和返回值1.使用返回值处理错误需要程序员严格的编程作风,程序员不论是否有这种习惯,这都是非常不希望的。2.正确的异常处理是C++中的一个常识。异常通过发出错误信号,可以让程序代码和错误处理代码分开,而且不会让程序忽略错误。3.必须了解使用了哪种错误处理方法,返回值还是抛出异常。如果不知道,那么你的程序肯定有问题。4.异常是基于每个线程而提出并处理的;异常不能被线程忽略,必须被处理;未处理的

作战在奇不在正,带兵在正不在奇 2328

字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间

本文介绍DepthAnything3(DA3)模型,一种能够从任意视觉输入中预测几何结构的创新解决方案。DA3采用Transformer骨干网络,通过统一的深度光线表示简化学习过程,支持单目/多视角深度估计、姿态估计和3D高斯预测等多项任务。模型系列包含基础版、度量级和单目专用版本,其中嵌套版本DA3NESTED-GIANT-LARGE表现最佳。代码库提供交互界面、CLI工具和多格式导出功能,支持模块化扩展。实验表明DA3在各项任务上超越现有模型,所有训练数据均来自公开学术数据集。

2506_90492529的博客 2550

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化

饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。

qq_42212808的博客 155

[C++番外] 第三十三节 抛异常

异常总体而言,利大于弊,所以工程中我们还是鼓励使用异常的。

2301_80017277的博客 1401

终于找到两个稳定好用的Docker镜像加速源,拉取速度提升几十倍!

国内使用Docker经常遇到镜像拉取慢、超时失败的问题🐳 本文分享两个亲测好用的免费镜像加速源⚡ 实测拉取速度从十几分钟缩短到几十秒,稳定性接近100%📊 支持一键配置脚本,支持多平台使用✨

XiaoqiangClub的博客 957

C++中处理异常的方法及代码演示

异常处理就是处理程序中的错误。所谓错误是指在程序运行过程中发生的一些异常事件。

weixin_58796863的博客 690

【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA

【WRFDA实操第一期】安装 WRFPLUS 和 WRFDA

WW、forever的博客 2038

手把手教你新建一个winform项目(史上最全)

本文介绍如何利用visual studio新建一个winform程序

qq_34059233的博客 4万+

C++ throw

我们知道C++ 异常处理的流程,具体为: 抛出(Throw)--> 检测(Try) --> 捕获(Catch) 异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出,即使有异常也检测不到。 在 C++ 中,我们使用 throw 关键字来显式地抛出异常,它的用法为: throw exceptionData; exceptionData 是“异常数据”的意思,它可以包含任意的信息...

weixin_45743799的博客 9096

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2584

exception java_总结java的exception

这篇和前面的 总结java的interface和abstract class 一样。跳过最基础语法不聊,只说一些比较tricky的东西和一些好的practice.语法:Exception继承自Throwable. Throwable还有一个儿子是Error,但是一般用不到。不过有些二百五面试官喜欢问回字有几种写法,所以还是要知道有Error这回事的。Exception分为checked和unche...

weixin_39624332的博客 220

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

总结java的exception

转载自:http://www.blogjava.net/vcycyv/archive/2011/02/22/344791.html下面是转载内容的分割线——————————————————————————————语法: Exception继承自Throwable. Throwab

ilbubby的专栏 580

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java exception 封装_SpringCloud异常处理统一封装我来做-使用篇

SpringCloud异常处理统一封装我来做-使用篇简介重复功能我来写。在 SpringBoot 项目里都有全局异常处理以及返回包装等,返回前端是带上succ、code、msg、data等字段。单个项目情况下很好解决,当微服务模块多的情况下,很多情况开发都是复制原有代码进行构建另外一个项目的,导致这些功能升级需要修改多个服务,在这个基础上,我们封装了一个组件 unified-dispose-spr...

weixin_34631696的博客 345

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

通过异常处理错误

一、概念 异常:阻止当前方法或作用域继续执行的问题。 异常和普通问题的区别:普通问题是指,在当前环境下能得到足够的信息,总能处理这个错误。异常就不能继续下去了,因为在当前环境下无法获得必要的信息来解决问题。你所能做的就是从当前环境跳出,并且把问题提交给上一级环境,这就是抛出异常时所发生的事情。 当异常抛出时,首先将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从当前环境中弹

Eason的博客 302

java异常退出分析_Java异常模型的详细介绍和分析(图)

一. 异常的引入及基础发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间编译器并不能找出所有的错误,余下的错误只有在运行期才能发现和解决,这类错误就是 Throwable。这就需要错误源能够通过某种方式,把适当的信息传递给某个接收者,该接收者将知道如何正确的处理这个问题,这就是Java的错误报告机制 —— 异常机制。该机制使得程序把在正常执行过程中做什么事的代码与出了问题怎...

weixin_28828243的博客 446

第十二章 异常处理

异常处理理论上由两种模型:1、终止模型:错误非常关键,一旦发生,程序不能在继续执行下去。无法挽回了。              2、恢复模型:异常处理的工作是恢复程序的工作。然后尝试重新调用出错的方法。(不推荐,增加了过多的耦合,不容易维护) 创建自定义异常   必须从已有的异常类继承。 重新抛出异常: try{   m(); } catch(Exception e)...

weixin_33951761的博客 91

C# GDI+发生一般性错误(A generic error occurred in GDI+))

本文总结了C# GDI+出现"A generic error occurred in GDI+"错误的解决方法。首先建议使用Marshal.GetLastWin32Error()获取底层错误代码,并提供了常见错误代码的解析:ERROR_PATH_NOT_FOUND(路径不存在)、ERROR_ACCESS_DENIED(权限不足)和ERROR_SHARING_VIOLATION(文件被占用)。特别针对文件被占用的情况,给出了通过创建新Image对象并拷贝数据的解决方案。此外还提到可能导致错误的其他因素,如图像

黄同学的博客 5475

C#异常处理实战指南:从try-catch到全局异常处理

异常处理是编程语言中用于应对运行时错误的核心机制,其原理在于通过中断正常执行流并查找匹配的异常处理器来保证程序可控性。在C#开发中,合理的异常处理技术价值在于提升系统健壮性、可维护性和问题排查效率。应用场景广泛覆盖从用户输入验证、资源操作到分布式系统调用等环节。本文聚焦于C#的try-catch-finally结构,深入探讨异常捕获的设计哲学、资源管理的最佳实践以及如何避免常见的异常处理陷阱,帮助开发者构建更可靠的应用程序。

weixin_33690963的博客 358

.“.NET研究”Net中Exception你这样做了么?

  这篇文章旨在与园友分享我对Exception的理解,如果存在不足的地方欢迎您指出。   前不久写过一篇MVC的Exception的文章,这回重点讲解在实际开发中我对Exception 的认识。   讲到Exception难免会涉及到经典的代码try..catch...finally..至于一些基本概念:这个代码块的执行方式、多catch的异常捕获顺序、exception的继承。这些不是本篇讨论...

weixin_33800593的博客 74

【深入浅出C#】章节 6: 异常处理和调试:从概念到实战,构建健壮应用的异常处理策略

本文深入探讨了C#中的异常处理和调试策略,通过订单系统实例详细解析了异常处理的基础概念、高级技巧和实战应用。从try-catch-finally模式到自定义异常设计,再到性能优化和全局异常处理,帮助开发者构建健壮的应用程序。文章特别强调了异常处理在提升系统稳定性和用户体验中的关键作用。

weixin_33937778的博客 413

Thking in java(第四版)-查缺补漏(第12章)

背景 继续查缺补漏 1.异常与记录日志 例如: import java.io.*; import java.util.logging.*; class LoggingException extends Exception{ private static Logger logger= Logger.getLogger("LoggingException"); public Log...

DeepingC 252

第十二章 通过异常处理程序

概要异常分为两种,一种是Error,一种是Exception。前者是系统编译时和系统错误。后者是程序代码错误。Exception的父类是Throwable。下面是重点内容:1.throws new Exception();代表着异常抛出。其实异常抛出跟方法返回差不多,异常抛出会从该点返回一个异常类,然后结束这个方法。 2.我们会在try块后跟多个catch(Exception e)语句,值得注意的是

一个22岁,但职业病缠身的代码搬运工 451
上一篇: 错误处理和异常处理,你用哪一个
下一篇: 异常
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值