第七章 异常(Exception)处理

合集下载

Java异常(Exception)处理以及常见异常总结

Java异常(Exception)处理以及常见异常总结

Java异常(Exception)处理以及常见异常总结⽬录前⾔异常简介异常类型总结前⾔很多事件并⾮总是按照⼈们⾃⼰设计意愿顺利发展的,经常出现这样那样的异常情况。

例如:你计划周末郊游,计划从家⾥出发→到达⽬的→游泳→烧烤→回家。

但天有不测风云,当你准备烧烤时候突然天降⼤⾬,只能终⽌郊游提前回家。

“天降⼤⾬”是⼀种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。

计算机程序的编写也需要考虑处理这些异常情况。

异常(exception)是在运⾏程序时产⽣的⼀种异常情况,已经成为了衡量⼀门语⾔是否成熟的标准之⼀。

⽬前的主流编程语⾔java也提供了异常处理机制。

异常简介Java中的异常⼜称为例外,是⼀个在程序执⾏期间发⽣的事件,它中断正在执⾏程序的正常指令流。

为了能够及时有效地处理程序中的运⾏错误,必须使⽤异常类,这可以让程序具有极好的容错性且更加健壮。

在 Java 中⼀个异常的产⽣,主要有如下三种原因:1. Java 内部错误发⽣异常,Java 虚拟机产⽣的异常。

2. 编写的程序代码中的错误所产⽣的异常,例如空指针异常、数组越界异常等。

3. 通过 throw 语句⼿动⽣成的异常,⼀般⽤来告知该⽅法的调⽤者⼀些必要信息。

Java 通过⾯向对象的⽅法来处理异常。

在⼀个⽅法的运⾏过程中,如果发⽣了异常,则这个⽅法会产⽣代表该异常的⼀个对象,并把它交给运⾏时的系统,运⾏时系统寻找相应的代码来处理这⼀异常。

我们把⽣成异常对象,并把它提交给运⾏时系统的过程称为拋出(throw)异常。

运⾏时系统在⽅法的调⽤栈中查找,直到找到能够处理该类型异常的对象,这⼀个过程称为捕获(catch)异常。

例 1为了更好地理解什么是异常,下⾯来看⼀段⾮常简单的 Java 程序。

下⾯的⽰例代码实现了允许⽤户输⼊ 1~3 以内的整数,其他情况提⽰输⼊错误。

package io.renren.config;import java.util.Scanner;/*** Created by LiYangYong*/public class TestException {public static void main(String[] args) {System.out.println("请输⼊您的选择:(1~3 之间的整数)");Scanner input = new Scanner(System.in);int num = input.nextInt();switch (num) {case 1:System.out.println("one");break;case 2:System.out.println("two");break;case 3:System.out.println("three");break;default:System.out.println("error");break;}}}正常情况下,⽤户会按照系统的提⽰输⼊ 1~3 之间的数字。

第七讲异常

第七讲异常

调用者如何使用声明强制异常处理的方法 软件调用者(及使用者) 软件调用者(及使用者)在调用声明强制 异常处理的方法时,用两种处理方法: 异常处理的方法时,用两种处理方法: 1、在调用该方法的方法中捕捉相应的异常。 、在调用该方法的方法中捕捉相应的异常。 2、在调用该方法的方法首部声明抛出相应 、 的异常。(采用throws关键字) 。(采用 关键字) 的异常。(采用 关键字
5 用户定义的异常
Java定义的完善的 定义的完善的Exception类,对于常见的 定义的完善的 类 异常都能产生异常对象。 异常都能产生异常对象。 对于某个应用程序所特有的错误,则需要编程 对于某个应用程序所特有的错误, 人员根据程序的特殊逻辑在用户程序中自己创 建异常类和异常对象。 建异常类和异常对象。 用户定义的异常类型必须是Throwable的子 用户定义的异常类型必须是 的子 直接或间接), ),Java推荐以 推荐以Exception类 类(直接或间接), 推荐以 类 作直接父类创建用户异常类。 作直接父类创建用户异常类。
5 用户定义的异常
良好的程序应该当异常发生时, 良好的程序应该当异常发生时,给出相 应的提示信息, 应的提示信息,告诉用户到底发生了什 么错误, 么错误,可采用创建用户异常方法来解 决。 举例:参见下页源码阅读。 举例:参见下页源码阅读。
//UserDefineException.java public class IllegalSalaryException extends Exception { private Employee m_ConcernedEmp; //Employee对象 对象 private double m_IllegalSalary; //非法工资 非法工资 IllegalSalaryException( ) //构造方法 无参构造方法 构造方法1—无参构造方法 构造方法 {super(“不合法的起薪:低于最低工资”);} 不合法的起薪:低于最低工资” 不合法的起薪 void IllegalSalaryException(Employee emp,double iSal) //构造方法 构造方法2 构造方法 { this(); m_ConcernedEmp=emp; m_IllegalSalary=iSal; } public String toString() { String s; if(m_ConcernedEmp!=null) s="非法工资雇员号 非法工资雇员号"+m_ConcernedEmp.getEmpNo() + "非法工资额 非法工资额 非法工资雇员号 " + m_IllegalSalary + "合法最低工资 + Employee.getMinSalary(); 合法最低工资" 合法最低工资 else s="不合理,不能创建 不合理, 对象"; 不合理 不能创建Employee对象 对象 return; } }

第7章 程序异常处理与调试技术

第7章  程序异常处理与调试技术

第7章 程序异常处理与调试技术 在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由 编译器发现并给出提示。另外一种是运行错误,这类错误不能在编译阶段查出 ,只能在程序执行时发现,称为运行错误。Delphi提供了一种机制来处理运行 错误,保护程序的正常执行,这种机制就是异常处理。异常处理的方法是把正 常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序 正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块 ,继续执行后续的程序。 7.1 异常处理 对于在应用程序中经常产生的异常,Delphi都进行了定义。如在 SysUtils单元中定义了类型转换异常(EConvertError),数学异常 (EMathError),输入输出异常(EInOutError)等;在ComCtrl单元定义了日 期异常(EDateTimeError),在Db单元中定义了数据库异常 (EDatabaseError),等。因此只需在单元中引用这些系统库单元就可以处理这 些异常
1.监视表达式 选择【View】→【Debug Windows】→【Watches】可以打开监视列表窗口 【Watch List】。在该窗口中单击鼠标右键,在弹出的快捷菜单中选择 【Add Watch】打开监视属性对话框,可以添加新的变量或表达式。如图所 示。
2.计算/修改表达式 选择【Run】→【Evaluate/Modify】可打开计算/修改对话框。如图7-4 所示。
一般有三种处理方式: 1.不管发生什么异常,使用统一的错误处理方式 Try … //需要检测的语句,例如可以是 X:=Y/Z Except HandleALLException; End; End; 2.某些异常使用特殊的处理方式,而其余的异常使用统一的处理方式。 对于一些可以预测的错误,使用更为详细的处理方式。例如: Try … Except On EZeroDivide Do HandleZeroDivideError //处理被零除错误 On EOverflow Do HandleOverflowError //处理溢出错误 On EMathError Do HandleMathError //处理其他数学异常 Else HandleAllOtherError //前面没有被处理的异常则由该程序负责处理 End;

异常

异常

1 什么是异常
程序的编译和运行结果如下: Java Visaul Basic C++ Exception in thread "main" ng.ArrayIndexOutOfBoundsException: 3 at Exception2.main(Exception2.java:8) 上面的例子编译可以通过,但运行时出现异常信息被抛出。 在其循环被执行四次之后,数组下标溢出,程序终止,并带 有错误信息,就象前面所示的程序那样。
1 什么是异常
【例3】被0除的例子 // Exception3.java class Exception3{ public static void main(String args[]){ int a=0; System.out.println(5/a); } } 我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下: Exception in thread "main" ng.ArithmeticException: / by zero at Exception3.main(Exception3.java:5) 因为除数不能为0,所以在程序运行的时候出现了除以0 因为除数不能为0,所以在程序运行的时候出现了除以0溢出的异常事件。
1 什么是异常
当编译这个程序时,屏幕上会输出下面的信息: Exception1.java:5: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown FileInputStream fis = new FileInputStream("text.txt"); ^ Exception1.java:7: unreported exception java.io.IOException; must be caught or declared to be thrown while((b=fis.read())!=while((b=fis.read())!=-1) { ^ Exception1.java:10: unreported exception java.io.IOException; must be caught ordeclared to be thrown fis.close(); ^ 3 errors

异常Exception处理_听韩顺平课笔记

异常Exception处理_听韩顺平课笔记
练习2: catch中的++i会执行,但是不return finally一定执行,返回4
练习3:
练习3答案: catch中的++i执行了,但不会直接返回,将i的值保存到临时变量temp中,继续执行finally块 finally对i进行自加一操作,输出i=4,finally块执行完毕 返回临时变量temp的值,3
4.常 见 五 大 运 行 时 异 常
空指针异常:
空指针异常实例:
算数异常:除以0
数组下表越界异常:
类型转换异常:
数字格式不正确异常:
5.异 常 练 习
编译异常:在编译期间就必须处理的异常,否则代码不能通过编译
常见的编译异常:
案例:
练习:查看代码是否有问题
6.异 常 处 理 机 制
异常处理的方式:两种 try-catch-finally(释放资源),程序员在代码中捕获发生的异常,自行处理,finally一定会执行,如果没有发生异常,catch代码块不执 行 throws,将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。JVM处理异常:1.输出异常信息 2.退出程序 如果程序员没有显示处理异常,默认throws
练习题2: 练习2答案:
没有命令行传值的话,先抛出数组下表越界异常: 练习3:
考点:try中代码抛出异常后,剩余的代码不会执行 练习4:
16.异 常 处 理 小 结
13.throw VS throws
throw VS throws 一栏表: throws跟的是异常类型,throw跟的是异常对象
测试题: 考点:finally 在 throw 之前执行
14.异 常 习 题 1
练习题1: 分析涉及异常:

异常(例外)处理(Exceptions)(精)

异常(例外)处理(Exceptions)(精)
Java中定义了各种异常
3
Java中定义的异常类
Java中定义了各种异常类。ng.Throwable 是这些类的父类。 VirtualMachineError Error AWTError
ArithmeticException
NullPointerException IndexOutOfBoundsException EOFException
Hello! HELLO WORLD ! ! ng.ArrayIndexOutOfBoundsException at HelloWorld.main(HelloWorld.java:7)
2
Exception 的概念
Exception 是在程序运行时打断正常程序流程的 异常的情况 •试图打开的文件不存在 •网络链接中断 •操作数越界 •要加载的类文件不存在
10
//本例演示异常的父子类关系,注意父类异常的catch语句应该应该 //放在其子类异常catch语句的后面,否则,其子类异常永远不会被捕获。 public class TestException4 { public static void main(String [] args) { try { int a1=Integer.parseInt(args[0]); int a2=Integer.parseInt(args[1]); int result=a1/a2; System.out.println("The result is " + result); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("下标越界:"+e.getMessage()); } catch(ArithmeticException e) { System.out.println("除数为零:"+e.getMessage()); } catch(Exception e) //若Exception的子类被捕获,则Exception不再会被捕获 { System.out.println("捕获了异常:"+e.getMessage()); } finally { System.out.println("进入Finally语句块"); } } }

Python中异常(Exception)的总结

Python中异常(Exception)的总结

Python中异常(Exception)的总结Python中的异常处理异常处理的语句结构try:<statements> #运⾏try语句块,并试图捕获异常except <name1>:<statements> #如果name1异常发现,那么执⾏该语句块。

except (name2, name3):<statements> #如果元组内的任意异常发⽣,那么捕获它except <name4> as <variable>:<statements> #如果name4异常发⽣,那么进⼊该语句块,并把异常实例命名为variableexcept:<statements> #发⽣了以上所有列出的异常之外的异常else:<statements> #如果没有异常发⽣,那么执⾏该语句块finally:<statement> #⽆论是否有异常发⽣,均会执⾏该语句块。

说明else和finally是可选的,可能会有0个或多个except,但是,如果出现⼀个else的话,必须有⾄少⼀个except。

不管你如何指定异常,异常总是通过实例对象来识别,并且⼤多数时候在任意给定的时刻激活。

⼀旦异常在程序中某处由⼀条except ⼦句捕获,它就死掉了,除⾮由另⼀个raise语句或错误重新引发它。

raise语句raise语句⽤来⼿动抛出⼀个异常,有下⾯⼏种调⽤格式:raise #可以在raise语句之前创建该实例或者在raise语句中创建。

raise #Python会隐式地创建类的实例raise name(value) #抛出异常的同时,提供额外信息valueraise # 把最近⼀次产⽣的异常重新抛出来raise exception from E例如:抛出带有额外信息的ValueError: raise ValueError('we can only accept positive values')当使⽤from的时候,第⼆个表达式指定了另⼀个异常类或实例,它会附加到引发异常的__cause__属性。

异常处理

异常处理

三、抛出异常
前面只是说明了如何获取Java运 前面只是说明了如何获取Java运 Java 行时被系统引发的异常。同时, 行时被系统引发的异常。同时,程序 还可以用throw语句引发明确的异常, throw语句引发明确的异常 还可以用throw语句引发明确的异常, throws语句来标明一个成员函数可 用throws语句来标明一个成员函数可 能抛出的各种异常。
Exception类的主要方法
1.public Exception() 2.public Exception(String s) 3.public String toString()//返回异常类的信息 4.public void printStackTrace()//打印输出当前 例外对象的堆栈使用轨迹,也就是程序先后 调用执行了哪些对象或类的哪些方法,使得 运行过程中产生了这个例外对象。
四、自定义异常
尽管Java的内置异常处理大多数常见错误 尽管Java的内置异常处理大多数常见错误,你 Java的内置异常处理大多数常见错误, 也许希望创建自己的异常类型来处理所应用的特 殊情况。做到这点非常简单:只要定义 Exception的一个子类就可以了 Exception当然 的一个子类就可以了( Exception 的一个子类就可以了 ( Exception 当然 Throwable的一个子类 的一个子类) 是 Throwable 的一个子类 ) 。 你的子类不需要实 际执行什么——它们在类型系统中的存在允许你 际执行什么 它们在类型系统中的存在允许你 把它们当成异常使用。 把它们当成异常使用。 Exception类自己没有定义任何方法。当然, Exception类自己没有定义任何方法。当然, 类自己没有定义任何方法 它继承了Throwable提供的一些方法。 Throwable提供的一些方法 它继承了Throwable提供的一些方法。因此所有 异常,包括你创建的,都可以获得Throwable Throwable定 异常,包括你创建的,都可以获得Throwable定 义的方法, 义的方法,

第7章 调试、测试和异常处理

第7章 调试、测试和异常处理

}
} return true;
17
示例-Catch自定义异常
private void Submit_Click(object sender, System.EventArgs e) { if(textName.Text.Length == 0 && textEmail.Text.Length == 0) { MessageBox.Show("请填写正确的信息!", "填写提示" , MessageBoxButtons.OK , rmation); return; } try { InfoSave (textName.Text, textEmail.Text); } catch(EmailCheckException err) { MessageBox.Show(err.Message, "邮件格式错误" , System.Windows.Forms.MessageBoxButtons.OK , rmation); return; } MessageBox.Show(“发送成功。", "成功" , MessageBoxButtons.OK , rmation); }
14
示例-抛出异常
在main()方法中执行下面的代码,会抛出异常 try { Class1 cls1=new Class1(); cls1.SomeMethod(200);//参数越界 } catch(ArgumentOutOfRangException e) { Console.WriteLine(e.Message); }
15
示例-建立自定义异常
using System; public class EmailCheckException:ApplicationException { public string _mes; //重写构造函数 public EmailCheckException():base() { _mes = null; } public EmailCheckException(string message):base() { _mes = message.ToString(); } public EmailCheckException(string message, Exception myNew):base(message,myNew) { _mes = message.ToString(); } //Message属性的重载 public override string Message { get { return "格式错误"; } } }

Exception的异常分类与处理

Exception的异常分类与处理

Exception的异常分类与处理⼀、异常:1:错误的分类1)Error:错误(不可控),⼀般指的是系统⽅⾯的异常,⽐如蓝屏,内存溢出,jvm运⾏环境出现了问题。

2) Exception:是可控的异常,程序员可以在编写程序时解决的错误。

3)两者的⽗类为Throwable;2:可以控制的异常:Exception:是所有异常的⽗类,其下⾯可以派⽣出很多⼦类型。

3:异常处理机制。

在编写程序时,某⼀块代码可能会某些异常。

我们应该对这块1)进⾏异常处理。

怎么处理呢?如下语法:--解决⽅法try{捕捉代码⽚段出现的异常信息,然后封装成异常对象//可能出现异常的代码块放⼊try{}中,}catch(异常类型的声明--引⽤捕捉到的异常对象){//处理异常}finally{/*不管try中是否出现异常,都会执⾏此部分代码。

⼀般都⽤来⽤做关闭,释放等操作。

try中出现return 也会执⾏finally中的语句*/}2)进⾏处理过程:我们将可能出现异常的代码块放⼊try{}中,①jvm会进⾏检查try{}中的代码,如果有异常,jvm就会将异常信息封装成相应的异常对象,然后转移到catch(){}代码块中进⾏处理,执⾏{}中的业务逻辑。

最后会执⾏finally模块的代码。

②如果try{}中没有异常出现,最后也会执⾏finally模块中的逻辑。

4:catch代码块:①数量上:可以有1个或多个,②执⾏顺序:从上到下的catch块使⽤的异常类型可以是同级别的;如果多个异常类型有⽗⼦关系时,那么应该先写⼦异常,再写⽗异常。

(先写⽗异常时,编译不通过)先处理⼦类型异常,再处理⽗类型异常。

5:finally代码块:①finally代码块是有没有异常都会执⾏的,最后执⾏。

②通常⽤于关闭某些操作,删除临时⽂件等;③不管try有没有异常当程序中有return关键字的时候,先执⾏return,再执⾏finally代码块6:throw : 抛出异常对象。

异常(Exception)

异常(Exception)

ZTE中兴软件职业技术培训中心
double triangle(double,double,double); void InputData( double &x, double &y, double &z); int main(void) { double a, b, c; while(1) { try { InputData(a,b,c); cout << "area=" << Triangle(a,b,c) << endl; break; } catch(int) { cout << "两边之和应大于第三边!" << endl; } catch(double) { cout << "边长不得小于0!" << endl; } }
ZTE中兴软件职业技术培训中心
异常处理初步:常见的异常
• 访问越界
const int KArrSize = 10; vector<int> array(KArrSize); for (int i=0; i < 100; i++) { array[i] = 100; }
ZTE中兴软件职业技术培训中心
ZTE中兴软件职业技术培训中心
异常处理
参考:C++程序设计教程
ZTE中兴软件职业技术培训中心
本次议题
• 异常处理初步 • C++异常处理机制 • 异常的组织形式
ZTE中兴软件职业技术培训中心
异常处理初步
问题的产生
#include <cmath> #include <cstdio> using namespace std; double Triangle(double a, double b, double c) { double area; double s = (a+b+c)/2; area = sqrt(s*(s-a)*(s-b)*(s-c));

PHP异常处理Exception类

PHP异常处理Exception类

PHP异常处理Exception类异常(Exception)⽤于在指定的错误发⽣时改变脚本的正常流程。

什么是异常? PHP 5 提供了⼀种新的⾯向对象的错误处理⽅法。

异常处理⽤于在指定的错误(异常)情况发⽣时改变脚本的正常流程。

这种情况称为异常。

当异常被触发时,通常会发⽣:当前代码状态被保存代码执⾏被切换到预定义的异常处理器函数根据情况,处理器也许会从保存的代码状态重新开始执⾏代码,终⽌脚本执⾏,或从代码中另外的位置继续执⾏脚本我们将展⽰不同的错误处理⽅法:异常的基本使⽤创建⾃定义的异常处理器多个异常重新抛出异常设置顶层异常处理器异常的基本使⽤当异常被抛出时,其后的代码不会继续执⾏,PHP 会尝试查找匹配的 "catch" 代码块。

如果异常没有被捕获,⽽且⼜没⽤使⽤ set_exception_handler() 作相应的处理的话,那么将发⽣⼀个严重的错误(致命错误),并且输出"Uncaught Exception" (未捕获异常)的错误消息。

让我们尝试抛出⼀个异常,同时不去捕获它:1){throw new Exception("Value must be 1 or below");}return true;}//trigger exceptioncheckNum(2);>上⾯的代码会获得类似这样的⼀个错误: Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} thrown inC:\webfolder\test.php on line 6 Try, throw 和 catch 要避免上⾯例⼦出现的错误,我们需要创建适当的代码来处理异常。

异常错误处理

异常错误处理

异常处理
例: EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('数据库中没有编码为 '||v_empno||'的员工'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM); END;
用户自定义的异常处理
例:DECLARE v_empno emp.empno%TYPE :=&empno; no_result EXCEPTION; BEGIN UPDATE emp SET sal=sal+100 WHERE empno=v_empno; IF SQL%NOTFOUND THEN RAISE no_result; END IF; EXCEPTION WHEN no_result THEN DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM); END;
在该错误语句块的外部有一个 异常错误,则该错误能被抓住
谢谢
非预定义的异常处理
例:DECLARE v_deptno dept.deptno%TYPE :=&deptno; deptno_remaining EXCEPTION; PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); /* -2292 是违反一致性约束的错误代码 */ BEGIN DELETE FROM dept WHERE deptno=v_deptno; EXCEPTION WHEN deptno_remaining THEN DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM); END;

第7章 异常处理机制

第7章 异常处理机制

异常的产生 【例7-1】数组下标越界
异常处理机制
Java的异常处理机制是通过面向对象的方法处理
异常
一.抛出异常 当程序发生异常时,不能正常执行,称为“抛 出(throw)”一个异常; 一个异常可以由jvm自动生成,也可以由程序 中的方法产生 异常对象包含了错误类型与相应的错误信息
第七章 异常处理机制
本章目标
1. 理解掌握异常的概念与异常类的层次结构 2. 理解掌握异常的产生和常见的异常类
3. 理解掌握异常处理机制和try-catch-finally语句
4. 掌握自定义异常类
§第7章 异常处理机制
学习指南
仔细阅读本章各知识点的内容, 深刻理
解 java 语言中独特的例外处理机制,掌
a[0]=0; //访问长度为0的数组,产生异常
String str=null; System.out.println(str.length()); //产生异常
常见的公用异常类
3. ClassCastException----强制类型转换
无法强制类型转换的操作,在进行强制类型转换时会 出现此异常,如 Object obj=new Object(); String str= (String) obj;
其中, throws是关键字,异常类列表中可以有多个异 常类,用逗号隔开; 抛出异常的方法并不处理异常,
注意: throw与throws
在语义与用法的区别
§7.4 抛出异常类
class ts { public void go(int i) throws Exception{ if (i>0) {throw new Exception("over boounds"); } System.out.println("产生异常!"); } public static void main(String[] args) { ts x=new ts(); try{x.go();} catch(Exception e){ System.out.println(e.toString()); } } }

第7章__例外处理

第7章__例外处理
用于抛出一个例外 用于声明方法可能抛出的例外类型

throw e;


throws Etype1, Etype2 ……

1、例外的概念
程序中的例外不外乎两种情况:一种是运行环境不能 满足程序运行的要求而出错;一种是程序要解决的问 题的约束而导致的。 不管是哪种情况,编写程序时,程序员要考虑到程序 运行时可能遇到的各种情况(条件),并进行处理; 如果不能处理,或者不知该如何处理,就可以认为是 一种错误,这时,就需要交给别人去处理。 以前,是通过返回错误代码来提示别人程序有错误; 在Java中,则是通过例外机制通知别人出错信息。
1、例外的概念
{
用例外的形式处理错误:
try { openTheFile; determine its size; allocate that much memory; read-File; closeTheFile; } catch(fileopenFailed) catch(sizeDetermineFailed) catch(memoryAllocateFailed) catch(readFailed) catch(fileCloseFailed) finally

Exception:一般程序中可预知的问题,其产生的例外 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。

2、例外的分类
用户自己产生的例外
Throwable
Exception
处理
Error
不做处理 由用户捕获或 声明并处理 RuntimeException

AWTError (in java.awt) …
2、例外的分类

Java基础-异常(Exception)处理

Java基础-异常(Exception)处理

Java基础-异常(Exception)处理 Java基础-异常(Exception)处理 作者:尹正杰版权声明:原创作品,谢绝转载!否则将追究法律责任。

⼀.异常的概述 什么是异常?Java代码在运⾏时期发⽣的问题就是异常。

在Java中,把异常信息封装成了⼀个类。

当出现了问题时,就会创建异常类对象,并抛出异常相关信息(如异常信息出现的位置,原因等)。

⼆.异常的继承体系 在Java中使⽤Exception类来描述异常。

Exception类及其⼦类是Throwable的⼀种形式,它指出了合理应⽤程序想要捕获的异常条件。

查看Java的API⽂档我们可以发现Exception有继承关系,它的⽗类是Throwable。

Throwable是Java语⾔中所有错误或异常的超类。

另外,在异常Exception类中,有⼀个⼦类要特殊说明⼀下,RuntimeException⼦类,RuntimeException及其它的⼦类只能在Java程序运⾏过程中出现。

我们再来观察Throwable类,能够发现与异常Exception平级的有⼀个Error,它是Throwable的⼦类,它⽤来表⽰Java程序中可能会产⽣的严重错误。

解决办法只有⼀个,修改代码避免Error错误的产⽣。

下⾯是⼀个Error异常的案例: 综上所述,异常继承体系可以⼤致做以下简要分类,此处并未列出全部的异常,请以Java的API⽂档为标准,下图只是为了⽅便记忆:三.异常对象的产⽣原因和处理⽅式 我们看见上⾯的代码是有异常抛出的,那么异常究竟是怎么抛出的呢?其实他⼤致分为以下⼏个步骤:1>.JVM检测到异常 通过上⾯的学习,我们知道异常的祖宗其实就是Throwable类,在这个类下⾯很多个⼦类已经提前定义好了。

在代码运⾏的时候,JVM是完全有能⼒检测到出现的异常信息(⽐如:ArrayIndexOutOfBoundsException)。

2>.JVM创建异常对象 当JVM虚拟机检测到异常后,⾸先会创建异常对象(⽐如:new ng.ArrayIndexOutOfBoundsException: 5)。

第七章 异常(Exception)处理

第七章 异常(Exception)处理

异常处理的优点

把错误处理代码从常规代码中分离出来 按错误类型和差别分组


对无法预测的错误进行捕获和处理
克服了传统方法的错误信息有限的问题 把错误传播给调用堆栈


系统预定义异常对象
Throwable
Exception
Error VirtualMachineError
RuntimeException IOException ArithmeticException
异常的执行流程



正常顺序 1,2,3,5 异常顺序 1,2,4,5 try块外异常不理会
异常发生处
try{
1 2 3 } catch(Exception e){ 4
}
5
在try/catch块后加入finally块,可以确保无论是否发生异常, finally块中的代码总能被执行
try 块
有异常 无异常 catch 块
finally 块
举例
public class HelloWorld2 { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello world!", "No, I mean it!", "HELLO WORLD!!" }; while (i < 4) { try { System.out.println (greetings[i]); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("Re-stting Index Value"); } finally { System.out.println("This is always printed"); } i++; } }}

Python中的异常(Exception)处理

Python中的异常(Exception)处理

Python中的异常(Exception)处理异常当你的程序出现例外情况时就会发⽣异常(Exception)。

例如,当你想要读取⼀个⽂件时,⽽那个⽂件却不存在,怎么办?⼜或者你在程序执⾏时不⼩⼼把它删除了,怎么办?这些通过使⽤异常来进⾏处理。

类似地,如果你的程序中出现了⼀些⽆效的语句该怎么办?将会对此进⾏处理,举起(Raises)它的⼩⼿来告诉你哪⾥出现了⼀个错误(Error)。

错误你可以想象⼀个简单的 print 函数调⽤。

如果我们把 print 误拼成 Print 会怎样?你会注意到它的⾸字母是⼤写。

在这⼀例⼦中,Python 会抛出(Raise)⼀个语法错误。

>>> Print("Hello World")Traceback (most recent call last):File "<stdin>", line 1, in <module>NameError: name 'Print'is not defined >>> print("Hello World")Hello World你会注意到⼀个 NameError 错误被抛出,同时 Python 还会打印出检测到的错误发⽣的位置。

这就是⼀个错误错误处理器(Error Handler)2 为这个错误所做的事情。

异常我们将尝试(Try)去读取⽤户的输⼊内容。

按下 [ctrl-d] 来看看会发⽣什么事情。

>>> s = input('Enter something --> ')Enter something --> Traceback (most recent call last):File "<stdin>", line 1, in <module>EOFError此处 Python 指出了⼀个称作 EOFError 的错误,代表着它发现了⼀个⽂件结尾(End of File)符号(由 ctrl-d 实现)在不该出现的时候出现了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
异常(Exception)处理 第七章 异常(Exception)处理
异常
运行期出现的错误 运行期
代码
public class HelloWorld { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello!","No","WORLD!"}; while (i < 4) { System.out.println (greetings[i]); i++; } } }
:go()和main() – 在go方法中声明要抛出异常,在该方法体内, 抛出一个Exception对象 – 在main()方法中,调用go方法,使用try/catch 捕获go方法中抛出的异常
用户自定义异常对象
系统预定义异常类代表了程序运行过程中可能产生的绝大 多数异常。如果希望记录和应用相关的错误信息,则可创 建自己的异常类。该类的定义和普通类无太大区别,只需 继承Exception类或RuntimeException类即可。例如:
多重catch块
一段代码可能会引发多种类型的异常 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹 配的catch语句 执行其中的一条 catch 语句之后,其后的 catch 语句将被忽略
抛出异常
如果在当前环境无法解决一个异常,就要 将其抛出,把异常交给调用者处理
练习
try 块 有异常 无异常 catch 块
finally 块
举例
public class HelloWorld2 { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello world!", "No, I mean it!", "HELLO WORLD!!" }; while (i < 4) { try { System.out.println (greetings[i]); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("Re-stting Index Value"); } finally { System.out.println("This is always printed"); } i++; } }}
关于异常的设计
异常处理不是用来代替测试程序 不要压制异常 抛出异常不是一件坏事
RuntimeException
FileNotFoundException
Exception
类 Exception 定义了一些你的程序可能出 现的轻度错误条件 异常可能发生在:
你试图打开的文件并不存在 网络连接中断 操作数处理的超出预描述的范围 需要加载的文件丢失
Error 类定义了一些严重的错误条件
public class Test{ public static void main(String[] args){ Test t=new Test(); try { t.connectMe("sinojava", 80); } catch (ServerTimedOutException e){ System.out.println("连接服务器 连接服务器"+e.getServerName()+",端口为 端口为"+e.getPort()+"失败 失败"); 连接服务器 端口为 失败 }} public void connectMe(String serverName,int port) throws ServerTimedOutException{ if(serverName.equals("sinojava")&&port==80){ System.out.println("连接成功 连接成功!"); 连接成功 }else throw new ServerTimedOutException("sinojava", port); } }
自定义异常举例: 自定义异常举例
public class ServerTimedOutException extends Exception{ private String serverName; private int port; public ServerTimedOutException(String serverName, int port){ this.serverName=serverName; this.port = port; } public int getPort(){ return port; } public void setPort(int port){ this.port = port; } public String getServerName(){ return serverName; } public void setServerName(String serverName){ this.serverName = serverName; }}
异常的执行流程
正常顺序 1,2,3,5 异常顺序 1,2,4,5 try块外异常不理会
异常发生处
try{ 1 2 3 } catch(Exception e){ 4 } 5
块后加入finally块,可以确保无论是否发生异常, 在try/catch块后加入 块后加入 块 可以确保无论是否发生异常, finally块中的代码总能被执行 块中的代码总能被执行
Java异常的使用 异常的使用
对非运行时异常必须捕获或声明。对运行时异常, 对非运行时异常必须捕获或声明。对运行时异常,若不能预测它 何时发生,程序可不作处理,而是交给Java运行时系统来处理; 运行时系统来处理; 何时发生,程序可不作处理,而是交给 运行时系统来处理 若能预知它可能发生的地点和时间,则应在程序中处理, 若能预知它可能发生的地点和时间,则应在程序中处理,而不应 简单地交给运行时系统。 简单地交给运行时系统。 异常可以人为地抛出, 语句。 异常可以人为地抛出,用throw new 语句。 异常可以是系统已经定义好的,也可以是用户自己定义的。 异常可以是系统已经定义好的,也可以是用户自己定义的。用户 自己定义的异常一定继承自Throwable或Exception类。 自己定义的异常一定继承自 或 类 在自定义异常类时, 在自定义异常类时,如果它所对应的异常事件通常总是在运行时 产生,而且不容易预测它将在何时何地发生, 产生,而且不容易预测它将在何时何地发生,可以将它定义为运 行时异常,否则应定义为非运行时异常。 行时异常,否则应定义为非运行时异常。 应该使用finally语句为异常处理提供统一的出口。 语句为异常处理提供统一的出口。 应该使用 语句为异常处理提供统一的出口
public class MyProjException extends Exception { …… }
自定义异常
通过继承ng.Exception类声明自己 的异常类。 在方法适当的位置生成自定义异常的实例, 并用throw抛出。 在方法的声明部分用throws声明该方法可 能抛出的异常。
异常处理机制
如果一个异常没有在当前的try、catch中 被处理,它将被抛至方法的调用者处。 如果异常被返回到main方法里,并且仍然 没有被处理,程序将异常中止。
练习
编写一个类ExceptionTest1,在main方法 中使用try、catch、finally:
– 在try块中,编写被0除的代码 – 在catch块中,捕获被0除所产生的异常,并且 处理异常 – 在finally块中,打印一条语句
异常处理的优点
把错误处理代码从常规代码中分离出来 按错误类型和差别分组 对无法预测的错误进行捕获和处理 克服了传统方法的错误信息有限的问题 把错误传播给调用堆栈
系统预定义异常对象
Throwable Exception Error VirtualMachineError IOException ArithmeticException NullPointerException ClassNotFoundException
手动抛出异常
声明方法可能要 抛出的各种异常
finally
无论是否发生异常, 无论是否发生异常, 代码总能执行
try,catch 语句的使用
try { //这里的代码可能抛出一个特别的异常 } catch (MyExceptionType e) { 如果MyExceptionType 的异常被抛出,将执 行这里的代码 } catch (Exception e) { 如果一个一般 Exception 被抛出时,将执行 这里的代码 }
正常与异常
正常与异常之比可达30% 比 70%
– 打开文件
文件不存在? 文件打不开?
– 读取文件
没有足够可读内容? 权限不允许读
– 写文件
磁盘满 网络断线
– 关闭文件
异常机制简介
在进行程序设计时,错误的产生是不可避免的, 如何处理错误?把错误交给谁去处理?程序又该 如何从错误中恢复?这是任何程序设计语言都要 解决的问题。 所谓错误,是在程序运行过程中发生的异常事件, 比如除0溢出、数组越界、文件找不到等,这些 事件的发生将阻碍程序的正常运行。为了增加程 序的强壮性,程序设计时,必须考虑到可能发生 的异常情况并做出相应的处理。
Java的异常处理是通过 个关键字来实现的:try、catch、 的异常处理是通过5个关键字来实现的 的异常处理是通过 个关键字来实现的: 、 、 finally、throw、throws 、 、
相关文档
最新文档