1、不要做出任何应用程序才需要考虑抉择策略,不能想当然的决定一些错误情形。具体的一个体现形式是什么异常都捕获。这不是类库的职责,因为无法掌握所有的调用者的使用情形,这些不确定性是委托、虚方法、接口等特性带来的。

一个直观的例子是调用者可能故意在委托中抛出异常以便在后面的逻辑中捕获它。

同时编写类库与应用程序的开发者往往会混淆二者的边界。

2、务必使用finally保证清理代码的执行。(或者相关语法糖using、lock等)

3、从异常状态中恢复。

类库方法也会调用其它类库方法,如果知道方法会抛出什么异常并且能够恢复的话,就去处理它。

4、如果修改状态,就要做好出错的准备,在发生无法恢复的异常时回滚部分完成的操作。

5、有时可以考虑隐藏实现细节来维系协定,专注于当前类库的业务。(慎用,调试变困难了)

比如一个转换工具类,捕获文件不存在的异常,抛出自定义的转换失败异常。

6、在方法无法完成其功能时选择抛出异常是最佳的对象模型。在调用者指出频繁抛出异常导致性能问题时才考虑提供Tryxxx方法。

Tryxxx方法不代表捕获所有异常,它返回false只代表那一种高频的错误,其它错误仍然抛出异常。

一个典型的例子就是官方库中的int.TryParse。返回false只代表字符串无法解析为int。当遇到内存不足或实参无效时,它仍然会抛出异常。

7、有必要强调,Tryxxx方法是为了规避频繁触发一种或一类异常而设计的。它并不是为了捕获所有异常而设计。

一个典型的例子就是官方库中的int.TryParse。返回false只代表字符串无法解析为int。当遇到内存不足或实参无效时,它仍然会抛出异常。

8、不要使用错误码(包括true/false表示的特殊错误码)代替异常处理。

因为clr与类库选择抛出异常,而你的方法采用错误码。现在所有人都需要处理两种机制。

所以在C#中设计一个方法,最后的总结是:完成动作或抛出异常;预见高频错误与简化错误处理时提供有限的状态码;有限的状态码预见有限的错误;布尔类型是最简洁的状态码,返回布尔类型不代表不会抛出异常。

C#(面向对象的托管语言)类库(区别于应用程序)的异常处理思路的更多相关文章

  1. 托管DLL和非托管DLL的区别

    首先解释一下,托管DLL和非托管DLL的区别.狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件.非托管DLL不是在Dotnet环 境生成的DLL文件. 托管DLL文件,可以在Dotnet环境 ...

  2. JAVA和C语言的区别

    java语言和c语言的区别:                                      1 un 公司推出的Java 是面向对象程序设计语言,其适用于Internet 应用的开发,称为 ...

  3. 面向对象和结构化程序设计的区别X

    面向对象和结构化程序设计的区别 结构化程序的概念首先是从以往编程过程中无限制地使用转移语句而提出的.转移语句可以使程序的控制流程强制性的转向程序的任一处,在传统流程图中,就是用上节我们提到的" ...

  4. c++学习书籍推荐《面向对象程序设计:C++语言描述(原书第2版)》下载

    百度云及其他网盘下载地址:点我 <面向对象程序设计:C++语言描述(原书第2版)>内容丰富,结构合理,写作风格严谨,深刻地论述了c++语言的面向对象编程的各种技术,主要内容包括:面向对象编 ...

  5. 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介

    [源码下载] 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介 作者:webabcd 介绍不可或缺 Windows Native 之 ...

  6. AJPFX总结面向对象(this和super的区别和应用)

    面向对象(this和super的区别和应用)(掌握)* A:this和super都代表什么        * this:代表当前对象的引用,谁来调用我,我就代表谁        * super:代表当 ...

  7. 关于"动态语言" "静态语言" "静态类型语言" "动态类型语言"的区别

    参考链接:关于“编译型”“解释型”“动态语言”“静态语言”“动态类型语言”“静态类型语言”的区分以及优缺点(汇总整理) 很多人把这两类混为一谈,但是这是完全不同的两个概念!!! 动态和静态语言主要看的 ...

  8. 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

    阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...

  9. C语言编写的bmp读写程序

    C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 <span style="font-size:16px;">#include "Windows ...

  10. C语言之一天一个小程序

    程序示例: #include <stdio.h> #include <stdlib.h> int main() { printf("Hello,world!\n&qu ...

随机推荐

  1. 运筹帷幄,质效兼修:源启云原生基础设施管理平台助推企业IT基础资源能效跃迁

    导语 数字化大潮席卷,企业需要建设一套能够满足云原生环境下基础资源一体化管理和快速交付的基础设施自动化管理系统,系统需要具备"云上""云下""容器&q ...

  2. LNMP Wordpress phpMyAdmin的部署记录

    背景 CentOS 8.2服务器,使用的虚拟服务器.只开放22与80端口.设置默认页面是wordpress的入口,phpmyadmin使用虚拟目录的形式进行访问. 安装 总体思路按照此文章进行.我进行 ...

  3. springboot 2.x 集成quartz持久化到一个单独的dataSource时遇到的坑

    由于希望可以在集群环境中运行定时job,但考虑到多个job实例有可能带来job重复执行的问题,新项目的job打算从原生的spring task实现改成quartz job实现,并采用jdbc的存储方式 ...

  4. [转]Bundle Adjustment简述

    原文链接:https://optsolution.github.io/archives/58892.html或https://blog.csdn.net/optsolution/article/det ...

  5. Spring Data JPA中使用Example进行动态查询

    Spring Data JPA中使用Example进行动态查询主要涉及:实体对象.ExampleMatcher和Example等三种类类型.基于实例的动态查询所包含的三要素如下:1.实体对象:在ORM ...

  6. 关于vue加element-ui上传文件获取文件的sha256的值 第二篇 更改压缩包编码错误

    这个依然需要插件crypto-js 首先下载引入 import CryptoJs from "crypto-js"; 话不多说直接上代码,首先是element的上传 <el- ...

  7. springboot starter 原理解析及实践

    什么是springboot starter starter是springBoot的一个重要部分.通过starter,我们能够快速的引入一个功能,而无需额外的配置.同时starter一般还会给我提供预留 ...

  8. C#数据结构与算法入门实战指南

    前言 在编程领域,数据结构与算法是构建高效.可靠和可扩展软件系统的基石.它们对于提升程序性能.优化资源利用以及解决复杂问题具有至关重要的作用.今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望 ...

  9. cmake-4

    cmake-4学习,参考 cmake构建c++项目快速入门2-1 cmake构建c++项目快速入门2-2 了解 cmake的工作原理: Windows下用cmake编译cmake (1)先下载cmak ...

  10. Drawable图形定制

    设置背景设置背景 button或者textview我们想要自定义他的背景就需要用到Drawable中创建xml文件 例如 shape标签是用来控制背景的形状的 他下面的子标签有 stroke控制描边 ...