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. Win10底部任务栏卡死的终极解决方法

    原因:微软自带的资讯和兴趣因国内网络限制,造成失效. 解决方案:底部右键->资讯和兴趣->关闭. 以上仅限WIn10操作系统,win11操作系统以上忽略.

  2. Shiro简单入门+个人理解

    身为一个刚刚进入开发行业的学生,进入公司就开始了Shiro框架的应用,特此在这里写下收获. Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权 ...

  3. R数据分析:潜在转化分析LTA的做法和解释(一)

    之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCA R数据分析:用R语言做潜类别分析LCA Mplus数据分析:潜在类别分析(LCA)流程(详细版) R数据分析:再写潜在类别 ...

  4. Ubuntu终端输入异常、无法退格(删除文本)、使用方向键命令

    1 起因 为了学习嵌入式开发安装去安装的ncurses库,使用命令:sudo apt-get install libncurses5-dev导致系统自带的ncurses-base被自动删除. 2 出现 ...

  5. HP 打印机驱动

    HP Universal Print Driver Series for Windows https://support.hp.com/cn-zh/drivers/selfservice/hp-uni ...

  6. ArchLinux安装后常见问题的解决

    Q:UEFI引导grub-install报错:variables are not support on this system A:进入安装u盘的时候是传统引导模式,传统模式下无法安装UEFI启动,解 ...

  7. 基于Windows环境的Kafka搭建与.NET实战开发案例

    前言:基于Windows环境下的Kafka搭建(scal+zookeeper+Kafka+可视化工具).以及使用.NET6.0进行简单的生产者与消费者的演示 一.环境部署 Kafka是使用Java语言 ...

  8. Java集合容器面试题

    Java常用集合类有哪些?Collection接口的子接口包括:Set接口和List接口Map接口的实现类主要有:HashMap.TreeMap.Hashtable.ConcurrentHashMap ...

  9. 【JMeter】---入门

    JMeter入门 一.概述 JMeter是Apache下一款在国外非常流行和受欢迎的开源性能测试工具,JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能. ...

  10. 详细剖析Java动态线程池的扩容以及缩容操作

    前言 在项目中,我们经常会使用到线程来处理加快我们的任务.但为了节约资源,大多数程序员都会把线程进行池化,使用线程池来更好的支持我们的业务. Java线程池ThreadPoolExecutor有几个比 ...