- 浏览: 301201 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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 709推送现有文件夹 cd existing_folder git ... -
puma高并发
2020-08-19 09:31 475nginx突发大量502报错 top看一下,cpu的占用并不高 ... -
searchkick
2019-04-10 11:30 0# 通用查询块(条件) def general_ ... -
导入线下excell业务数据按权重匹配线上数据
2019-03-07 11:00 893业务场景:(系统间还没有接口对调,订单号暂时需要线下处理) 线 ... -
两对象同时映射一对一和一对多
2019-02-20 10:14 839class Kpi::Team < Applicat ... -
ruby一些类加载方式
2018-12-21 10:12 565require_dependency 'order/sco ... -
基于ruby的gem remotipart的异步上传文件
2018-12-21 10:11 532针对某一对象保存实例化之前,异步上传图片保存。 gem ' ... -
基于html2canvas的长图分享
2018-12-21 10:11 1160<span class="ui label ... -
rails处理上传读取excell&生成excell
2018-12-20 14:15 971gem 'spreadsheet' gem 'roo', ... -
基于ruby Mechanize的爬虫
2018-12-20 13:09 672def self.sang_carwler ... -
一些常用加密方式
2018-12-20 13:02 730sign = OpenSSL::Digest::SHA256. ... -
ruby 调用restful接口示例
2018-12-20 12:02 926链接参数中添加token def self.query_p ... -
rails错误日志记录
2018-12-19 14:41 759Rails中对日志的处理采用的是“消息-订阅”机制,各部分组件 ... -
railsAPI接收Base64文件
2018-12-18 11:05 1038tmp_dir = " ... -
ruby 调用savon接口示例
2018-12-18 10:51 1019例子一 module Api module Aob ... -
关于国际商城现货展示与购物车的费用设计
2018-11-15 18:34 442关于国际商城现货展示 ... -
基于多线程的全局变量
2018-10-31 19:50 1162def current_nation def ... -
hash最小值过滤算法
2018-10-31 09:52 1086[["数量","包装" ... -
阿里云裸机部署rails运用
2018-10-08 20:33 1387登录阿里云后首先 sudo apt-get update a ... -
打包订单单据发给货代
2018-09-11 15:43 1179pdf&excell&png # rend ...
相关推荐
Python学习--异常处理思维导图!!来源于网易云课堂王顺子
1. **嵌套异常信息**:Nesty可以保存每个`rescue`块中发生的完整异常链,这样在处理异常时,你可以获取到完整的错误上下文。 2. **自定义异常类型**:除了标准的Ruby异常类,Nesty还允许创建自定义异常类型,这有助...
- **异常处理**:探讨 Ruby 中的异常处理机制,包括 raise 和 rescue 关键字的使用。 - **递归函数**:学习如何使用递归函数解决复杂问题。 ### 三、内置类和模块 #### 3.1 内置必需类 - **基本数据类型**:介绍 ...
处理异常的情态通常在`exception`关键字后定义,通过`when`子句指定异常名称,并跟随处理错误的语句序列。可以使用`or`连接处理多个异常,例如处理`no_data_found`和`too_many_rows`异常。`when others then`语句...
### 掌握 Ruby 的异常处理:优雅应对错误的艺术 #### 引言 异常处理作为编程中的基础技能之一,在任何一种编程语言中都占有极其重要的地位。对于 Ruby 这种注重简洁性和可读性的语言而言,良好的异常处理机制更是不...
- 重新抛出异常:在处理异常后,可以使用`raise`不带参数的形式将异常重新抛出,以便在上层代码中处理。 学习Python的异常处理对于编写健壮的程序至关重要,它能够帮助你预测并解决潜在的问题,避免程序无故崩溃,...
- 异常类如`StandardError`、`RuntimeError`等,可以通过`raise`抛出异常。 7. **元编程**: - Ruby的元编程能力强大,可以在运行时修改类和对象的行为。 - `class_eval`、`instance_eval`、`define_method`等...
Python提供了try、except、raise语句来实现异常处理。 2.8 异常处理 2.8.1 异常处理例 在Python中,异常处理是通过try、except语句来实现的。try语句块中包含可能出现错误的代码,except语句块中包含错误处理代码...
RAISE 语句是 PL/SQL 异常处理机制的另一个重要部分,用于抛出异常。例如,RAISE_APPLICATION_ERROR(-20001, 'Error message'); 结论 ---- Oracle 存储过程 exception 异常处理大全及实例经典最终是 Oracle 数据库...
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 --...
# 处理异常 ... finally: # 总是执行的代码 ... ``` 在复杂的异常处理场景中,还可以使用`except`来捕获多种类型的异常,或者使用`except Exception as e`来捕获所有未被明确捕获的异常。此外,`else`块可以在`...
- `begin-rescue-end`用于捕获和处理异常。 - `raise`用于引发异常,`ensure`确保在任何情况下执行的代码。 7. **块(Block)和闭包** - 块是Ruby中的匿名函数,由`do..end`或花括号`{}`定义,可以与方法一起...
2. **抛出自定义异常**:当遇到需要自定义错误处理的情况时,可以使用`raise`语句抛出自定义异常,附带相关错误信息。 ```python try: # 一些可能会引发异常的代码 raise CustomException("发生了一个自定义错误...
本教程"Python自学教程-11-体验异常.ev4"着重于帮助学习者理解和掌握如何在Python中处理异常,以确保程序在遇到错误时能够优雅地运行而不是突然崩溃。 异常是程序在执行过程中遇到的问题或错误,如除以零、打开不...
- Ruby提供了异常处理机制,通过`begin...rescue...end`块捕获和处理错误。 - `raise`关键字用于抛出异常,`ensure`确保在任何情况下都会执行的代码。 - 测试是软件开发的重要部分,Ruby有内置的测试框架如Test::...
在Python编程语言中,异常处理是一项重要的功能,它允许我们优雅地处理程序运行时可能出现的错误。本资源“python烟花代码-24-自定义异常代码实现之异常类.ev4.rar”显然关注的是如何在Python中自定义异常类,这在...
- **结构化异常**: 这是微软特定的一种异常处理方式,主要用于Windows平台,可以通过`__try`和`__except`块来捕获和处理异常。 ##### 1.2 异常的生命阶段 异常的生命周期分为以下几个阶段: 1. **发生阶段** ...
- 使用`try/except`语句可以捕获并处理异常。例如: ```python try: # 可能引发异常的代码 except ExceptionType: # 处理特定类型的异常 except: # 捕获所有其他类型的异常 finally: # 无论是否发生异常...