[2]ruby&ruby on rails入门笔记---Ruby中的异常

原创 2016年11月02日 00:32:53
Ruby中异常处理非常的重要,Ruby中异常处理,包括Exception 捕获,Retry,Raise,ensure ,Else格式,Throw...Catch已经类级别的异常。其具体格式和用法如下。
1. Exception 捕获,其格式如下,和Java中的try...catch...finally有的一拼
begin
# -
rescue OneTypeOfException
# -
rescue AnotherTypeOfException
# -
else
# Other exceptions
ensure
# Always will be executed
end
--------Sample------
begin
file= open("/unexistant_file")
puts"-----1111111----"
iffile
puts"-----222222----"
puts"File opened successfully"
end
rescue
puts"-----exceptions----"
file=STDIN
end
printfile,"==",STDIN,"\n"
-----------输出结果-------------
-----exceptions----
#<IO:0x22703d0>==#<IO:0x22703d0>

2. Retry
begin
# Exceptions raised by this code will
# be caught by the following rescue clause
rescue
# This block will capture all types of exceptions
retry # This will move control to the beginning of begin
end
--------Sample------
begin
puts"Try to open file"
file= open("/unexistant_file")
iffile
puts"File opened successfully"
end
rescue
fname="existant_file"
puts"Begin to retry"
retry
end
-----------输出结果会有无限的循环-------------
Try to open file
Begin to retry
Try to open file
Begin to retry
Try to open file
Begin to retry
。。。。。

3.Raise 相当于java中的throw 关键字,自己显式抛出异常
raise
OR
raise "Error Message"
OR
raise ExceptionType, "Error Message"
OR
raise ExceptionType, "Error Message" condition

begin
puts 'I am before the raise.'
raise 'An error has occurred.'
puts 'I am after the raise.'
rescue
puts 'I am rescued.'
end
puts 'I am after the begin block.'
------------------------------------------
I am before the raise.
I am rescued.
I am after the begin block.

4.ensure 相当于java中的finally语句
begin
#.. process
#..raise exception
rescue
#.. handle error
ensure
#.. finally ensure execution
#.. This will always execute.
end

begin
raise'A test exception.'
rescueException=>e
putse.message
putse.backtrace.inspect
ensure
puts"Ensuring execution"
end
-----------输出结果如下-------------
A test exception.
["D:/ruby/learnruby/exception_test.rb:28:in `<top (required)>'", "-e:1:in `load'", "-e:1:in `<main>'"] Ensuring execution

5. Else格式 Else用在异常语句中的情形是,当没有exception抛出来的时候
begin
#.. process
#..raise exception
rescue
# .. handle error
else
#.. executes if there is no exception
ensure
#.. finally ensure execution
#.. This will always execute.
end
--------Sample Code-----------
begin
# raise'A test exception.'
puts"I'm not raising exception"
rescueException=>e
putse.message
putse.backtrace.inspect
else
puts"Congratulations-- no errors!"
ensure
puts"Ensuring execution"
end
-----------输出结果如下-------------
I'm not raising exception
Congratulations-- no errors!
Ensuring execution

6. Throw...Catch 用来跳出循环,这个和Java的try catch有点区别
throw :lablename
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end
OR
throw :lablename condition
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end
--------------Sample----------------
puts"catchcatchcatchcatchcatchcatchcatchcatchcatchcatchcatchcatchcatch"
defpromptAndGet(prompt)
printprompt
res= readline.chomp
throw:quitRequestedifres=="!"
returnres
end
puts"111111111111111111111111111111111111"
catch:quitRequesteddo
puts"2222222222222222222222222222222"
name= promptAndGet("Name: ")
puts"333333333333333333333333333333"
age= promptAndGet("Age: ")
puts"444444444444444444444444444"
sex= promptAndGet("Sex: ")
puts"5555555555555555555555555555"
# ..
# process information
end
promptAndGet("Name1:")
-----------输出结果如下-------------
catchcatchcatchcatchcatchcatchcatchcatchcatchcatchcatchcatchcatch
111111111111111111111111111111111111
2222222222222222222222222222222
Name: Rodney
333333333333333333333333333333
Age: 33
444444444444444444444444444
Sex: Male
5555555555555555555555555555
Name1:Henry
Process finished with exit code 0

7. Class级别的异常
Ruby's standard classes and modules raise exceptions. All the exception classes
form a hierarchy, with the class Exception at the top. The next level contains
seven different types:
 Interrupt
 NoMemoryError
 SignalException
 ScriptError
 StandardError
 SystemExit

classFileSaveError<NoMemoryError
attr_reader:reason
definitialize(reason)
@reason=reason
end
end

File.open("input223g.txt","r")do|file|
begin
# Write out the data ...
puts"File can be opened!!!!"
raise'A test exception.'
rescue
# Something went wrong!
puts"Error happend!!!!"
puts$!
puts"-----Test----"
raiseFileSaveError.new($!)
puts"-----end----"
end
end
-----------输出结果如下-------------
C:\RailsInstaller\Ruby2.2.0\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) D:/ruby/learnruby/class_exception.rb
D:/ruby/learnruby/class_exception.rb:18:in `rescue in block in <top (required)>': FileSaveError (FileSaveError)
from D:/ruby/learnruby/class_exception.rb:9:in `block in <top (required)>'
from D:/ruby/learnruby/class_exception.rb:8:in `open'
from D:/ruby/learnruby/class_exception.rb:8:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'
File can be opened!!!!
Error happend!!!!
A test exception.
-----Test----
Process finished with exit code 1


版权声明:本文为博主原创文章,未经博主允许不得转载。

ruby on rails入门系列--一个简单的HelloWorld程序

 安装了ruby和ruals后,我们就可以在命令窗口通过rails这个命令行工具来创建ruals应用程序,使用rails工具可以很多事情变得简单。 在E盘的根目录下创建一个RubyProject...
  • oec2003
  • oec2003
  • 2008年04月13日 09:31
  • 3846

十大必读Ruby on Rails图书

【图灵图书推荐】Ruby for Rails中文版——Rails之父强力推荐的Ruby教程Antonio Cangiano,一位IBM 多伦多研究中心的软件工程师,Ruby, Haskell, Pyt...
  • turingbook
  • turingbook
  • 2007年07月29日 02:34
  • 9613

Ruby on Rails教程 和Ruby&Rails 入门大全,对新手很有用

我自己常用的gem包: 数据库驱动 mysql , sqlite3-ruby, postgre-pr,名字不言而喻。 很遗憾并不是所有的Ruby库都是通过gem方式安装,比如针对Oracle的ruby...
  • Bactryki28
  • Bactryki28
  • 2016年06月14日 12:00
  • 1530

Ruby on Rails 入门之:(3) Ruby中的多种字符串表示方法

在Ruby中,对字符串的处理提供了很多的函数。 Ruby提供了大量的字符串表示方式: [ruby] view plaincopy a = "\...
  • weixingstudio
  • weixingstudio
  • 2012年09月24日 19:41
  • 1398

ruby on rails 入门系列--rails目录结构简述

app     应用程序的大部分代码都将位于app目录中。在app目录下有四个子目录,分别是controllers,helpers,models,views ,rails是典型的mvc架构,代码分别对...
  • oec2003
  • oec2003
  • 2008年05月12日 08:10
  • 1400

ruby on rails 的redis 使用

redis 是非常强大的key-value数据库,性能特别高,适合大规模数据处理。不过,据说其数据存在在内存中,所以,还是尽量的少放些数据到其中吧。最好只放一个id号。 下载安装redi...
  • hexudong08
  • hexudong08
  • 2012年05月13日 14:04
  • 4588

ruby on rails 学习---终于搞明白多态,大家不明白的话,可以一起交流下

一、什么叫多态关联? “多态关联”。在多态关联中,在同一个关联中,模型可以属于其他多个模型。例如,收藏模型可以属于医院、医生、药品多个模型 二、收藏(liking)——医院(hospital)、...
  • u013435984
  • u013435984
  • 2016年12月14日 16:51
  • 501

ruby on rails select下拉框的使用,包括实现下拉框内容匹配搜索

select下拉框显示固定内容 select下拉框 枚举法 例如在student表单中,在拉框中显示性别“男”,“女”: html代码: 在这个模型的student.rb中: enum ...
  • u013601033
  • u013601033
  • 2017年08月16日 16:53
  • 315

Rails 3 与 Rails 4 中 try 方法的不同

Rails 最新版本中,在使用 try 调用私有方法的时候,有了一些差异 class User include Mongoid::Document private def say ...
  • dazhi_100
  • dazhi_100
  • 2014年12月16日 14:29
  • 1469

rails中建立model 和 修改字段的方法

转自:http://blog.csdn.net/remote_roamer/article/details/7977294 1. 新建一个model .用如下命令  [...
  • dazhi_100
  • dazhi_100
  • 2014年01月16日 17:32
  • 4468
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[2]ruby&ruby on rails入门笔记---Ruby中的异常
举报原因:
原因补充:

(最多只允许输入30个字)