时间:2021-05-22
一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据.
ruby>file=open("some_file")
ERR:(eval):1:in`open':Nosuchfileordirectory-some_file
一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到检查每一个可能导致错误发生的系统调用的返回值并立刻做出决定.
FILE*file=fopen("some_file","r");
if(file==NULL){
fprintf(stderr,"Filedoesn'texist.\n");
exit(1);
}
bytes_read=fread(buf,1,bytes_desired,file);
if(bytes_read!=bytes_desired){
}
...
这项无聊的工作会使程序员最终变得马虎并忽略掉它,结果是程序无法应对异常.令一方面,这样也会降低程序的可读性.因为过多的错误处理使有意义的代码也变得杂乱了.
在Ruby里,就像其它的现代语言,我们可以通过隔离的办法处理代码域里的异常,因此,这有着惊人的效果却又不会为程序员或以后希望读它的其它人造成过度的负担.代码域由begin开始直到遇到一个异常,这将导致转向一个由rescue标记的错误处理代码域.如果异常没发生,rescue代码就不会使用.下面的代码返回文本文件的第一行,如果有异常则返回nil.
deffirst_line(filename)
begin
file=open("some_file")
info=file.gets
file.close
info#Lastthingevaluatedisthereturnvalue
rescue
nil#Can'treadthefile?thendon'treturnastring
end
end
有时我们会希望围绕问题展开创造性工作.这里,如果文件不存在,我们用标准输入代替:
begin
file=open("some_file")
rescue
file=STDIN
end
begin
#...processtheinput...
rescue
#...anddealwithanyotherexceptionshere.
end
retry用于rescue代码表示又重新执行begin代码.这让我们可以压缩前面的例子:
fname="some_file"
begin
file=open(fname)
#...processtheinput...
rescue
fname="STDIN"
retry
end
但这仍有一点瑕疵.一个不存在的文件将导致不停止地retry.你在使用retry做异常处理时应注意到这一点.
每个Ruby库在遇到错误时都会提交一个异常,你可以在自己的代码里明确地提交异常.用raise来提交异常.它带一个参数,也就是描述异常的一个字符串.参数是可选的但不应被省略.之后它可以通过一个特殊的全局变量$!访问.
ruby>raise"testerror"
testerror
ruby>begin
|raise"test2"
|rescue
|print"Anerroroccurred:",$!,"\n"
|end
Anerroroccurred:test2
nil
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#异常处理总结及简单实例一、异常处理的理解?异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。因此处理这种错误,就称为异常处理。二、
概念 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常 但并不是所有的错误都是异常 而处理这种错误,称为异常处理 异常处理实际
异常处理基本思想C++的异常处理的基本思想大致可以概括为传统错误处理机制、通过函数返回值来处理错误。1)C++的异常处理机制使得异常的引发和异常的处理不必在同一
导读:在Java中我们使用try-catch进行异常处理,同样的JavaScript也提供了和异常处理类似的异常处理机制,本节我们将对JavaScript异常处
Ruby是一种表达能力很强的语言,这得意于它异常丰富的运算符和语法糖,虽然Ruby一直把最小惊讶原则作为它的哲学之一,但还是常常看到让人惊讶不已,难于理解的代码