代码健壮性--异常处理中try catch finall throw throws五个关键字学习

本文主要是介绍代码健壮性--异常处理中try catch finall throw throws五个关键字学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

          ITOO技术攻坚过程中小编负责“代码优化”,其中一个亮点就是“异常处理”,在此通过博客形式分享给网友朋友们互相学习。                                                                                                                                                                          ---前言

    异常处理过程中,最为常用的就是大家经常看到的try、 catch、 finall结构体的使用,这篇文章就对于try catch 体系中的5个关键字进行详细介绍。

        

   一、Try-Catch基本结构        

try
{// X
}
catch (Exception ex)
{// Y
}
finally
{// Z
}

       try-catch体系理解:

   try(尝试)执行 X 这一段代码(认为X代码段是一段容易出现错误的代码段)。如果没有错误,那很好;如果 catch(捕捉)到错误了,那么执行 Y 这段代码。无论有没有错误,finally(最终)都执行 Z 这段代码。

   贴一个在MSDN官网中查到的小例子帮助理解:

class ExceptionTest
{static double SafeDivision(double x, double y){if (y == 0)throw new System.DivideByZeroException();return x / y;}static void Main(){// Input for test purposes. Change the values to see// exception handling behavior.double a = 98, b = 0;double result = 0;
try{result = SafeDivision(a, b);Console.WriteLine("{0} divided by {1} = {2}", a, b, result);}catch (DivideByZeroException e){Console.WriteLine("Attempted divide by zero.");}}
}

            Addition:对于Catch括号中捕获的异常类型,将在我接下来关于“异常处理”的博客中说明(这里水比较深),对于try catch finally先有一个简单的认识。

    Maybe读者很奇怪为什么我引用MSDN中这个例子里面没有”finally”呢?那就对他们之间的组合关系来梳理一下吧:

    try关键字用来包围可能会出现异常的逻辑代码,它单独无法使用,必须配合catch或者finally使用。他们之间的匹配方式有如下三种:

    (1)try...catch...;      

    (2)try....finally......;   

    (3)try....catch...finally...

  当然catch块可以有多个,注意try块只能有一个,finally块是可选的(但是最多只能有一个finally块)。

  三个块执行的顺序为try—>catch—>finally。

    至此,try catch 基本体系简单介绍完毕。


二、”Catch”详细梳理      

    Try catch体系已经熟悉之后,对于”try”,只要包住可以引发异常的代码段即可(哪些代码属于容易引发异常?思考中……),先来对于”Catch”来思考一番:

    顾名思义,Catch是“捕获”的意思,也就是说在这里要将异常进行捕获,对于Catch的使用一些细节进行总结:

   (1)通过断点调试发现,try代码段中没有错误,不会执行catch中的代码。

   (2)在捕获了异常之后什么都不做,相当于忽略了这个异常。千万不要使用空的catch块,空的catch块意味着你在程序中隐藏了错误和异常,并且很可能导致程序出现不可控的执行结果。---从大牛的博客中看到的一点,想想确实是,把异常捕获了,然后不处理,是不是有点徇私枉法的feeling呢?

 

   从网上看一个小小的故事:

   关于catch操作,永远记住,如果你不知道如何处理这个异常,你就让他抛出,让调用你的人去处理。假设A方法调用B方法,好比A是B的领导,指派B去干活,工作中出了纰漏,哪怕不是B的责任(比如B又调用了C,C出错了),如果B没这个权限的话,他就该把问题上报给他的领导,而不是私自把这个问题掩盖掉(catch且并不再throw出去)。

   其实Catch之后不进行处理也是这个道理,就像是把异常藏起来一样一样的。

 

   (3)catch块的顺序问题

    在一个try—catch体系当中,一个try是可以对应多个catch的,就像我们在J2SE中学习到的异常类型:

                

     对于不同类型的异常需要进行不同的捕获手段,就像是交警、武警、公安都是“警察”,但是他们抓的“坏人”确实不同的。

     看代码:

<pre code_snippet_id="1607501" snippet_file_name="blog_20160312_3_4693988" name="code" class="java" style="font-family: 宋体; font-size: 10.5pt;">public class Main {
public static void main(String[] args) {//调用打开文件的方法String str = new Main().openFile();System.out.println(str);}public String openFile() {try {FileInputStream inputStream = new FileInputStream("d:/zzh.txt");int ch = inputStream.read();System.out.println("zzh");return "step1";}catch (FileNotFoundException e) {System.out.println("file not found");return "step2";}catch (IOException e){
            System.out.println("IO Exception");
            return "step3";
<span style="font-size: 10.5pt;">        }</span><span style="font-size: 10.5pt;">finally{</span>
            System.out.println("finally block");//return "finally";
            //在finally后不能写return,会将异常信息覆盖掉}}
}
 

    一个小例子,打开D盘根目录下的”zzh.txt”文件,catch块有两个:1、FileNotFoundException 2、IOException,其中 FileNotFoundException是IOException的子类。

    我们在两个Catch块使用过程中,一定要把级别高的catch放到后面,就像例子当中,我在D盘没有”zzh.txt”文件,首先会被FileNotFoundException捕获,进而到finally块中执行,如果把IOException放到首位,由它将异常捕获后直接进入finally中,对于异常信息的提示就不会特别清楚,因为IOException这个异常的范围太广了,所提示的信息就不明确。

三、认识、对比Throw和Throws

    (1)Throws:出现在方法的声明中,表示该方法可能会抛出的异常,然后交给上层调用它的方法程序处理,允许throws后面跟着多个异常类型。   

Class A{Public void method() throws IOException{}
}

    (2)Throw:出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw出去。 

     我的理解:在try catch体系中,catch捕获到异常之后,要么自己处理掉,要么抛给调用该方法的上一级去处理,而throw就是实现这一过程的代码段。

     对比:Throws用于声明方法可能会抛出什么类型的异常,Throw则是真正的往出抛,一个“s”的差别,就是这样,理解很简单。


    对于throw这块,由于代码接触的不是很充分,还不够系统,简单的理解之后,以后的博客将会更详细的从理论和实践两条线来分享我对于“异常处理”的学习成果。

             

             上一篇异常处理:代码健壮性理论篇

             下一篇异常处理:.Net中异常处理的最佳实践(转)



这篇关于代码健壮性--异常处理中try catch finall throw throws五个关键字学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109737

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言