- 浏览: 287833 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
masuweng:
如何给新人机会 -
masuweng:
多sql结果集按列合并新结果报表实现方案 -
Ahe:
赞
坚持长跑方能赢 -
masuweng:
好好好
程序员如何更好的了解自己所做的事情 -
小楠人:
laoguan123 写道楼主好,使用过一些excel导入导出 ...
excell导入导出
Ruby 异常处理(转载)
异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。
ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:
Ruby代码
raise #抛出一个默认的RuntimeError
raise "Some error message" #抛出一个消息为"Some error message"的RuntimeError
raise ArgumentError #抛出一个无消息的ArgumentError
raise ArgumentError, "Bad data" #抛出一个消息为"Bad data"的ArgumentError
raise ArgumentError.new("Bad data") #同上
raise ArgumentError ArgumentError, "Bad data", caller[0] #抛出一个包含消息的格式为filename:line 或者 filename:line:in 'method' 的异常
以上代码中的raise可以使用别名fail代替,在没有明确的给出异常类型时,ruby默认抛出RuntimeError,其中最后一个例子抛出的信息 包含了当前错误所在的文件,行数已经所在的方法的信息,这些信息都存储在caller这个数组中,里面包含了方法调用者的相关信息,第一个元素包 含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用 的。
Ruby代码
def func1
puts caller #打印调用者信息
end
def func2
func1 #第六行
end
def func3
func2 #第十行
end
func3 #最终调用者,十三行
#运行结果
#test.rb:6:in `func2'
#test.rb:10:in `func3'
#test.rb:13
从上面的代码可以看出,caller记录了每个调用者所在的文件名,行数以及方法。
上面讲解了关于ruby异常抛出的方式以及caller数组的作用,接下来我们来了解一下ruby中是如何进行异常的捕捉的,在java中,异常 的捕捉是在try ... catch当中进行,而ruby则是在begin ... end代码块中进行异常的捕捉,在该代码块中使用rescue关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。
Ruby代码
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
end
以上代码就是一个大概的捕捉异常的例子,在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理,可是如果抛出的异常类型并没有显示的捕捉如何处理呢?那就是在最后使用else,如下:
Ruby代码
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
else
...... #如果以上代码类型都没有捕捉到,则运行该段代码
end
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
else
...... #如果以上代码类型都没有捕捉到,则运行该段代码
end
这时又有一个问题,如果我想获取异常信息又该如何做呢?请看下面的代码:
Ruby代码
begin
raise ArgumentError, "Bad data"
rescue => err
puts err
end
通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在ruby中又如何进行这些资源的清理呢?看 看下面的代码:
Ruby代码
begin
raise ArgumentError, "Bad data"
rescue => err
puts err
ensure
... #执行清理工作
end
从上面代码我们看到,ruby提供了一个关键字ensure,它的作用和java中的finally一样,无论任何异常,该关键字下的代码都必然 会在退出代码块前执行。同时,ruby还提供恢复功能,如果在抛出异常并进行异常处理后我们需要进行恢复工作,那就是使用retry就会重新执行代码块 了。
上面提到,异常的捕捉处理必须在begin-end代码块中进行,那是不是无论什么时候都要书写begin-end这两个关键字呢?其实也不是,在 ruby中,方法实际上就是一个隐式的begin-end代码块,所以在方法中进行异常的捕捉和处理,可以省略begin。
异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。
ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:
Ruby代码
raise #抛出一个默认的RuntimeError
raise "Some error message" #抛出一个消息为"Some error message"的RuntimeError
raise ArgumentError #抛出一个无消息的ArgumentError
raise ArgumentError, "Bad data" #抛出一个消息为"Bad data"的ArgumentError
raise ArgumentError.new("Bad data") #同上
raise ArgumentError ArgumentError, "Bad data", caller[0] #抛出一个包含消息的格式为filename:line 或者 filename:line:in 'method' 的异常
以上代码中的raise可以使用别名fail代替,在没有明确的给出异常类型时,ruby默认抛出RuntimeError,其中最后一个例子抛出的信息 包含了当前错误所在的文件,行数已经所在的方法的信息,这些信息都存储在caller这个数组中,里面包含了方法调用者的相关信息,第一个元素包 含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用 的。
Ruby代码
def func1
puts caller #打印调用者信息
end
def func2
func1 #第六行
end
def func3
func2 #第十行
end
func3 #最终调用者,十三行
#运行结果
#test.rb:6:in `func2'
#test.rb:10:in `func3'
#test.rb:13
从上面的代码可以看出,caller记录了每个调用者所在的文件名,行数以及方法。
上面讲解了关于ruby异常抛出的方式以及caller数组的作用,接下来我们来了解一下ruby中是如何进行异常的捕捉的,在java中,异常 的捕捉是在try ... catch当中进行,而ruby则是在begin ... end代码块中进行异常的捕捉,在该代码块中使用rescue关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。
Ruby代码
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
end
以上代码就是一个大概的捕捉异常的例子,在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理,可是如果抛出的异常类型并没有显示的捕捉如何处理呢?那就是在最后使用else,如下:
Ruby代码
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
else
...... #如果以上代码类型都没有捕捉到,则运行该段代码
end
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
else
...... #如果以上代码类型都没有捕捉到,则运行该段代码
end
这时又有一个问题,如果我想获取异常信息又该如何做呢?请看下面的代码:
Ruby代码
begin
raise ArgumentError, "Bad data"
rescue => err
puts err
end
通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在ruby中又如何进行这些资源的清理呢?看 看下面的代码:
Ruby代码
begin
raise ArgumentError, "Bad data"
rescue => err
puts err
ensure
... #执行清理工作
end
从上面代码我们看到,ruby提供了一个关键字ensure,它的作用和java中的finally一样,无论任何异常,该关键字下的代码都必然 会在退出代码块前执行。同时,ruby还提供恢复功能,如果在抛出异常并进行异常处理后我们需要进行恢复工作,那就是使用retry就会重新执行代码块 了。
上面提到,异常的捕捉处理必须在begin-end代码块中进行,那是不是无论什么时候都要书写begin-end这两个关键字呢?其实也不是,在 ruby中,方法实际上就是一个隐式的begin-end代码块,所以在方法中进行异常的捕捉和处理,可以省略begin。
发表评论
-
git仓库创建
2020-09-04 15:33 647推送现有文件夹 cd existing_folder git ... -
puma高并发
2020-08-19 09:31 437nginx突发大量502报错 top看一下,cpu的占用并不高 ... -
searchkick
2019-04-10 11:30 0# 通用查询块(条件) def general_ ... -
导入线下excell业务数据按权重匹配线上数据
2019-03-07 11:00 831业务场景:(系统间还没有接口对调,订单号暂时需要线下处理) 线 ... -
两对象同时映射一对一和一对多
2019-02-20 10:14 752class Kpi::Team < Applicat ... -
ruby一些类加载方式
2018-12-21 10:12 531require_dependency 'order/sco ... -
基于ruby的gem remotipart的异步上传文件
2018-12-21 10:11 497针对某一对象保存实例化之前,异步上传图片保存。 gem ' ... -
基于html2canvas的长图分享
2018-12-21 10:11 1115<span class="ui label ... -
rails处理上传读取excell&生成excell
2018-12-20 14:15 870gem 'spreadsheet' gem 'roo', ... -
基于ruby Mechanize的爬虫
2018-12-20 13:09 599def self.sang_carwler ... -
一些常用加密方式
2018-12-20 13:02 693sign = OpenSSL::Digest::SHA256. ... -
ruby 调用restful接口示例
2018-12-20 12:02 883链接参数中添加token def self.query_p ... -
rails错误日志记录
2018-12-19 14:41 675Rails中对日志的处理采用的是“消息-订阅”机制,各部分组件 ... -
railsAPI接收Base64文件
2018-12-18 11:05 1000tmp_dir = " ... -
ruby 调用savon接口示例
2018-12-18 10:51 938例子一 module Api module Aob ... -
关于国际商城现货展示与购物车的费用设计
2018-11-15 18:34 398关于国际商城现货展示 ... -
基于多线程的全局变量
2018-10-31 19:50 1067def current_nation def ... -
hash最小值过滤算法
2018-10-31 09:52 1040[["数量","包装" ... -
阿里云裸机部署rails运用
2018-10-08 20:33 1305登录阿里云后首先 sudo apt-get update a ... -
打包订单单据发给货代
2018-09-11 15:43 1145pdf&excell&png # rend ...
相关推荐
Python学习--异常处理思维导图!!来源于网易云课堂王顺子
理解 掌握 掌握 掌握 学习目标 理解异常的概念 1 2 掌握处理异常的几种方式 掌握raise和assert语句,会抛出自定义的异常 3 4 掌握with和as环境安装器的使用 精品课件----Python常见异常处理全文共71页,当前为第2页...
Python零基础速成班,适用于入门或初级学习人群,采用Jupyter Notebook原装教程,.ipynb格式拷贝到Jupyter Notebook目录下即可运行,网页交互式可视化Python编程,全中文注解,下载即用,对初学者非常友好,也可作为...
$ npm install raise-alarm -g $ raise-alarm 选项 -h, --help output usage information -V, --version output the version number -p, --port [number] specified the port 服务器 $ git clone --depth=1 --...
根据对设备的接近度和运动传感器的智能监控,向您的应用程序添加 Raise-To-Talk 手势检测。 如果检测到举起讲话手势,则支持通知。 用法 要运行示例项目, pod install克隆 repo,然后从 Example 目录运行pod ...
Python 异常机制 09_自定义异常类_raise抛出异常.mp4
7.1.1 使用Try-Except语句处理异常 7.1.2 Try_Finally 结构 7.1.3 异常基类及其属性和主要方法 7.1.4 Raise语句和异常处理的重引发 7.2 程序调试 7.2.1 调试的准备 7.2.2控制程序的执行 7.2.3 使用...
bugsnag-ext Bugsnag的有用扩展。 安装 将此行添加到应用程序的Gemfile中: gem 'bugsnag-ext' 然后执行: ... use FaradayMiddleware :: Bugsnag # Need to set before :raise_error faraday .
c,c++程序设计异常处理,希望可以对大家有用,提高大家对异常的处理能力。
此仓库包含负责任的AI系统和体验(RAISE)阅读小组的论文。 涵盖的主题包括(但不限于): 转移学习与转移 偏见与公平 可解释性 转移学习与转移 (02/2021)移植的 (06/2020) (02/2020) 陈述的可转移性 (02/...
购买并保存官方的Raise Chrome扩展程序! 在线购物时,请使用Raise Chrome扩展程序,以找到最优惠的价格和折扣,以便在结账时使用。 Raise会自动为您匹配最佳的礼品卡,以便在Raise.com上购买,迄今为止,我们的会员...
raise异常,情绪激动 用法 require "angry_raise" raise! "an error occured" # "RuntimeError: an error occured!" raise! SomeError , "an error occured" # "SomeError: an error occured!" raise! SomeError . ...
提高你的冬日 这是使用构建的 reddit 机器人示例 设置指南发布在此处: 感谢 Jonathan LeBlanc 的 Reddit PHP 包装器: :
显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常。例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在程序中使用下面的语句: ...
如果这些错误得不到正确的处理将会导致程序终止运行,所以本结需要学习Python强大的异常处理机制,合理地使用异常处理可以使程序更加健壮,具有更强的容错性,不会因为错误地输入或运行时遇到的问题而造成程序终止。...
c875b0f1dabda14f00a3e261d241f63e CentOS-7-x86_64-DVD-1511.isodba29c59117400b111633be2bf2aaf0e CentOS-7-x86_64-Everything-1511.iso7e46208ba6c5fe817a3ce981aa122f54 CentOS-7-x86_64-LiveGNOME-1511.isod9f...
单个异常使用 fail 关键字仅仅当捕获一个异常并且反复抛出这个异常(因为这里你不是失败,而是准确的并且故意抛出一个异常)。 begin fail 'Oops' rescue => error raise if error.message != 'Oops' end ...
本文实例分析了Python中的异常处理try/except/finally/raise用法。分享给大家供大家参考,具体如下: 异常发生在程序执行的过程中,如果python无法正常处理程序就会发生异常,导致整个程序终止执行,python中使用try...
提高旗标模拟器警告! 为我们的同志们感到高兴。 哦...我们可以听到我们湿wet的大象的性感声音,并体验宽恕的色彩带来的技术便利。 同志们,仪式即将结束时,请不要忘记您的物品。 请不要沉迷。...