Java语言提供两种异常处理机制:捕获异常和声明抛弃异常。
1、捕获异常:
(1)在Java程序运行过程中系统得到一个异常对象是,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。
(2)找到能够处理这种类型异常的方法后,运行时系统把当前异常交给这个方法处理;如果找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
(3)捕获异常是通过try-catch-finally语句实现的。语法为:
try{
...
}catch(ExceptionName1e){
...
}catch(ExceptionName2e){
...
}
...
}finally{
...
}
2、声明抛弃异常:
(1)当Java程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃异常。
(2)声明抛弃异常是在一个方法声明中的throws子句中指明的。如:
publicintread()throwsIOException{
...
}
其中throwsIOException就是声明抛弃异常,throws后可以跟多个异常类型。
扩展资料:
程序设计语言的异常机制:
1、多数语言的异常机制的语法是类似的:用throw或raise抛出一个异常对象(Java或C++等)或一个特殊可扩展的枚举类型的值(如Ada语言);
2、异常处理代码的作用范围用标记子句(try或begin开斗肆裂始的语言作用域)标示其起始,以第一个异常处理子句(catch,except,resuce等)标示其结束;可连续出现若干个异常处理子句,每个处理特定类型的异常。
3、某些语言允许else子句,用于无异常出现的情况。更多见的是finally,ensure子句,无论是否出现异常它都将执行,用于释放异常处理所需的一些资源。
(1)C++异常处理是资源获取即初始化(Resource-Acquisition-Is-Initialization)的基础。
(2)C语言一般认为是不支持异常处理的。Perl语言可选择支持结构化异常处理(structuredexceptionhandling)。
(3)雹昌Python语言对异常处理机制是非常普遍深入的,所以想写出不含try,except的空闭程序非常困难。
参考资料来源:
百度百科-异常处理
下面的代码同时使用了异常响应和异常保护橡亮好 异常响应用于设置变量的值 异常保护用于释放资源 当异常响应结束时利用raise重引发一个当前异常
var
APointer: Pointer
AInt ADiv: Integer
begin
ADiv :=
GetMem ( APointer )
try
try
AInt := div ADiv
except
on EDivByZero do
begin
AInt :=
raise
end
end
finally
FreeMem ( APointer )
end
end
上面一段代码体现了异常处理的嵌套 异常保护 异常响应可以单独嵌套也可以如上例所示的那样相互嵌套
自定义异常类的应用
利用Delphi的异常类机制我们可以定义自己的异常类来处理程序执行中的异常情况 同标准异常不同的是 这种异常情况并不是相对于系统的正常运行 而是应用程序的预设定状态 比如输入一个非法的口令 输入数据值超出设定范围 计算结果偏离预计值等等
使用自定义异常需要
自己定义一个异常对象类
自己引发一个异常
定义异常对象类
异常是对象 所以定义一类新的异常同定义一个新的对象类型并无太大区别 由于缺省异常处理只处理从Exception或Exception子类继承的对象 因而自定义异常类应该作为Exception或其它标准异常类的子类 这样 假如在一个模块中引发了一个新定义的异常 而这个模块并没有包含对应的异常响应 则缺省异常处理机制将响应该异常 显示一个包含异常类名称和错误信息的消息框
下面是一个异常类的定义
type
EMyException = Class(Exception)
自引发异常
引发一个异常 调用保留字raise 后边跟一个异常类的实例
假如定义
type
EPasswordInvalid = Class(Exception)键陵
则在程序中如下的语句将引发一个EPasswordInvalid异常
If Password <>CorrectPassword then
raise EPasswordInvalid Create( Incorrect Password entered )
异常产生时把System库单元中定义的变量ErrorAddr的值置为应用程序产生异常处的地址 在你的异常处理过程中可以引用ErrorAddr的值
在自己引发一个异常时 同样可以为ErrorAddr分配一个值
为异常分配一个错误地址需要使用保留字at 使用格式如下
raise EInstance at Address_Expession
自定义异常的应用举例
下面我们给出一个利用自定义异常编程的完整实例
两个标签框(Label Label )标示对应编辑框的功能 编辑框PassWord和InputEdit用于输入口令和数字 程序启动时Label InputEdit不可见 当在PassWord中输入正确的口令时 Label InputBox出现在屏幕上 此时Label PassWord隐藏
设计时 令Label InputEdit的Visible属性为False 通过设置PassWord的PassWordChar可以确定输入口令时回显在屏幕上的字符
自定义异常EInvalidPassWord和EInvalidInput分别用于表示输入的口令非法和数字非法 它们都是自定义异常梁铅EInValidation的子类 而EInValidation直接从Exception异常类派生
下面是三个异常类的定义
type
EInValidation = class(Exception)
public
ErrorCode: Integer
constructor Create(Const Msg: StringErrorNum: Integer)
end
EInvalidPassWord = class(EInValidation)
public
constructor Create
end
EInvalidInput = class(EInValidation)
public
constructor Create(ErrorNum: Integer)
end
EInValidation增加了一个公有成员ErrorCode来保存错误代码 错误代码的增加提供了很大的编程灵活性 对于异常类 可以根据错误代码提供不同的错误信息 对于使用者可以通过截取错误代码 在try…except模块之外来处理异常
从以上定义可以发现 EInvalidPassWord和EInvalidInput的构造函数参数表中没有表示错误信息的参数 事实上 它们保存在构造函数内部 下面是三个自定义异常类构造函数的实现代码
constructor EInValidation Create(Const Msg: StringErrorNum: Integer)
begin
inherited Create(Msg)
ErrorCode := ErrorNum
end
constructor EInValidPassWord Create
begin
inherited Create( Invalid Password Entered )
end
constructor EInValidInput Create(ErrorNum: Integer)
var
Msg: String
begin
case ErrorNum of
:
Msg := Can not convert String to Number
:
Msg := Number is out of Range
else
Msg := Input is Invalid
end
inherited Create(Msg ErrorNum)
end
对于EInvalidInput ErrorCode= 表示输入的不是纯数字序列 而ErrorCode= 表示输入数值越界
lishixinzhi/Article/program/Delphi/201311/25189楼主你好,代码给你伍粗写了一尘橘歼个,看下满派冲足你的要求不,
#include <iostream>
#include <string>
#include <math.h>
class NegativeNumberException
{
public:
NegativeNumberException()
{
m_str = ""
}
NegativeNumberException(std::string str)
{
m_str = str
}
void ShowErrorStr()
{
std::cerr <<m_str <<std::endl
}
private:
std::string m_str
}
double SquareRoot()
{
double num
std::cout <<"Please input a num :"
std::cin >>num
if (num <0)
{
throw NegativeNumberException("You input a negative num!\n")
}
else
{
return sqrt(num)
}
}
int main()
{
double result
try
{
result = SquareRoot()
}
catch (NegativeNumberException&e)
{
e.ShowErrorStr()
return 1
}
std::cout <<"The result is:" <<result <<std::endl
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)