ActionController::Base
rescue_from ActionController::RoutingError, :with=>:render_404
private
def render_404(exception = nil)
if exception
logger.info"Rendering 404: #{exception.message}"
end
render :file=>"#{Rails.root}/public/404.html", :status=>404, :layout=>false
end
异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。
ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:
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这个数组中,里面包含了方法调用者的相关信息,第一个元素包 含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用 的。
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关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
end
以上代码就是一个大概的捕捉异常的例子,在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理,可是如果抛出的异常类型并没有显示的捕捉如何处理呢?那就是在最后使用else,如下:
begin
...... #可能出现异常的代码
rescue errorType1 #要捕捉的异常类型
...... #处理异常的代码
rescue errorType2 #要捕捉的异常类型
...... #处理异常的代码
else
...... #如果以上代码类型都没有捕捉到,则运行该段代码
end
这时又有一个问题,如果我想获取异常信息又该如何做呢?请看下面的代码:
begin
raise ArgumentError, "Bad data"
rescue => err
puts err
end
通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在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。
分享到:
相关推荐
Rails异常处理程序 从版本1升级? 这是Rails的灵活异常处理程序,适用于希望创建自己的错误跟踪服务的人员。 它面向经验丰富的Rails开发人员,这些开发人员不仅要管理几个Rails应用程序,而且还要管理多个应用程序。...
Exception Notification - Rails的异常通知插件。能够在Rack/Rails应用发生错误时发送通知。
由于Web浏览器(Rails是Web框架)只能解释,因此必须将Ruby / Rails异常转换为浏览器可以读取的内容。 这是通过调用上述中间件来完成的。 - 如突出显示的那样,HTTP响应的构建独立于Rails堆栈。 这包括分配HTTP...
Rescue-Dog在引发Rails异常时会响应HTTP状态(代码和消息)。 安装 将“救援犬” gem添加到您的Gemfile gem 'rescue-dog' 并运行bundle install命令。 声明CRUD动作 包括Rescue::Controller (Rescue :: ...
所有过程,配置,操作及其数据都将保留下来,以进行处理和支持。 引擎具有用于配置流程模板和管理现有流程的UI。主要特点: 它是可安装的导轨引擎。 允许配置过程和操作模板。 允许配置同步和异步操作。 允许在后台...
书中实现了一个简易商城系统的 纯后台 API 项目!...- 第十一章:异常处理 - 第十二章:项目优化 - 第十三章:项目部署 前两章是开发的准备工作,从第三章开始进入项目开发阶段,按照用户、商铺、商品、
吊带 Suspenders是使用的基本Rails应用程序。 安装 首先安装吊带宝石: gem install suspenders 然后运行: suspenders projectname ...进行后台处理 静态页面的 的异常通知 以重置浏览器样式 用于访问Pos
领结 Bowties是使用的基本Rails应用程序,它是由Thoughtbot使用的出色的项目。... 异常通知 于CSS供应商前缀的 Sass mixins的 脚手架应用风格的 以进行后台处理 电子邮件验证程序,用于电子邮件验证 Flutie用
无需为您的应用编写自定义错误处理逻辑-Temescal会为您处理! 入门 将gem添加到您的Gemfile中,然后运行bundle install : gem 'temescal' 由于Temescal只是Rack中间件,因此将其添加到您的应用程序非常容易。 ...
如果您使用异常报告服务(例如Bugsnag),则可能需要定义一个错误处理程序。 有关更多信息,请参见。 主动工作依赖 维护任务框架依赖于后台的ActiveJob来运行任务。 ActiveJob的默认排队后端是。 强烈建议将其更改...
Ruby的Bugsnag异常报告程序Ruby的Bugsnag异常报告程序可立即通知您从Rails,Sinatra,Rack或纯Ruby...功能自动报告未处理的异常和崩溃报告已处理的异常附加用户信息以确定崩溃影响了多少人发送自定义诊断数据跟踪事件
我已经使用 Rails 和异常通知创建了一些应用程序,我喜欢它。 然后我开始了一个新的应用程序,它只包含 API 和后端处理。 它基于和 。 一旦我添加了require 'exception_notifier/email_notifier'来配置它应用程序...
java-project-templateHansBug的java工程模板,结构灵感取材于ruby on rails2333说明该模板将长期维(填)护(坑),敬请期待如果遇到bug等异常情况,可以在仓库内开issue反馈,并详细说明相关情况,作者将尽快处理如果...
与Rails类似, rescue_from块中的逻辑。 由祖先捕获异常,例如CustomError和rescue_from StandardError 。 每个架构配置。 没有依赖关系。用法定义GraphQL模式后: Schema = GraphQL :: Schema . define do query ...
当前,我们支持以下服务:SendGrid Mailgun邮戳CloudMailin Mandrill任何能够将消息路由到系统命令的邮件服务器,都是:high_voltage:Honeybadger.io带给您的,无痛的Rails异常跟踪。 安装添加进来! 到您的Gemfile并...
产品特点自动报告未处理的异常和崩溃报告处理的异常附加用户信息,以确定有多少人受到崩溃的影响发送定制的诊断数据跟踪导致崩溃的事件入门完成针对您的框架的集成指南中的说明:有关集成,请参见 放松!支持阅读...
结构化日志系统能够轻松处理消息,结构化数据或异常。 它具有与Node.js的或兼容的JSON格式化程序,以及与兼容的控制台可读格式。 安装 将此行添加到您的应用程序的Gemfile中: gem 'ougai' 然后执行: $ bundle ...
为代理安装 gem 以处理应用程序中未捕获的异常。 安装(Rails 3) 步骤 1.将它作为 gem 添加到Gemfile 中 gem 'runtimeerror_notifier' Step 2.执行以下命令生成config/initializers/runtimeerror_notifier.rb ...
异常猎人 Exception Hunter是一个Rails引擎,旨在跟踪您的Rails项目中的错误。 它通过使用Postgres数据库来保存错误及其相应的元数据(例如发生故障时的回溯或环境数据)来工作。 为此,我们会挂接到您应用程序的...