代码健壮性--异常处理中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

相关文章

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用