`

Rails异常处理

阅读更多
异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,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                                                       #抛出一个默认的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。


分享到:
评论

相关推荐

    rails_exception_handler:Ruby on Rails的异常处理

    Rails异常处理程序 从版本1升级? 这是Rails的灵活异常处理程序,适用于希望创建自己的错误跟踪服务的人员。 它面向经验丰富的Rails开发人员,这些开发人员不仅要管理几个Rails应用程序,而且还要管理多个应用程序。...

    rails敏捷开发的购物车系统

    在本文中,我们将深入探讨如何使用Rails敏捷开发技术构建一个购物车系统,特别是在参考《rails敏捷开发第四版》中的示例。Rails 3.2.6是本文的基础框架,它是一个强大的Ruby Web应用程序框架,以其MVC(模型-视图-...

    Ruby-Rails的异常通知插件

    在Ruby on Rails开发中,错误处理是至关重要的一个环节,因为它可以帮助开发者及时发现并修复问题,从而保持应用程序的稳定运行。"Ruby-Rails的异常通知插件"正是为了解决这个问题而诞生的。Exception Notification...

    rails-api-4.0.0

    可以通过rescue_from或自定义异常类来捕获和处理错误。 七、安全与认证: API的安全性至关重要。常见的安全策略包括OAuth2、JWT(JSON Web Tokens)或API密钥。Rails提供如devise_token_auth这样的库来协助实现这些...

    配置高可用的rails

    -Rails应用的性能基准:例如,Rails应用在处理请求时各个阶段的耗时,包括路由解析、模型加载、视图渲染等,这些数据对于定位性能瓶颈非常有帮助。 - 服务器资源的监控与优化:高可用的配置不仅仅是服务器的数量和...

    Ruby on Rails 指南 v5.0.1 中文版

    - **异常处理**:介绍如何处理运行时异常。 - **强制使用HTTPS协议**:指导如何强制客户端使用HTTPS协议访问应用。 #### Rails路由全解 - **Rails路由的用途**:解释Rails路由系统的作用。 - **资源路由:Rails的...

    Rails3 使用rake启动后台任务

    8. **错误处理与日志记录**: 在后台任务中,确保捕获并记录异常,以便于调试。同时,使用日志记录工具(如 Logger 或 Rails 的 logging 功能)记录任务的执行过程。 9. **测试后台任务**: 应该为后台任务编写单元...

    Ruby-GemExceptionTrack捕捉Rails应用运行期的异常并存储到数据库

    3. **异常处理**:在编程中,异常是程序运行时出现的错误。Ruby提供了`begin-rescue-end`结构来捕获和处理异常。 4. **数据库存储**:ExceptionTrack将异常信息存储在数据库中,可能是为了方便持久化和批量分析,...

    Ruby-karafka基于ApacheKafka的Ruby和Rails应用程序开发框架

    7. **错误处理**:内置的错误处理机制可以帮助开发者优雅地处理异常,避免因单个消息处理失败而导致整个消费者崩溃。 **使用Ruby-Karafka进行开发的基本步骤:** 1. **安装和配置**:首先,需要在项目中添加Ruby-...

    ruby on rails API

    5. 异常处理:在API中,错误通常以JSON格式返回,包括错误信息和状态码。可以使用`rescue_from`来捕获和处理异常,确保返回的错误信息结构化且易于解析。 6. 版本控制:对于长期维护的API,版本控制是必要的。Rails...

    Ruby和Rails高效的Kafka处理框架_Ruby_下载.zip

    3. **错误处理和恢复**:框架提供了内置的错误处理机制,确保即使在处理过程中出现异常,也能优雅地处理消息,避免数据丢失。 4. **线程和进程安全**:Karafka支持多线程和多进程消费,能够充分利用服务器资源,...

    敏捷Rails中文教程

    - **异常处理**:Ruby的异常处理机制允许开发者优雅地捕获和处理程序中的错误。 - **多线程与并发**:Ruby支持多线程编程,但需要注意的是,由于全局解释器锁(GIL)的存在,真正的并行执行在默认的Ruby实现中受限。 ...

    Rails Best Practices

    10. **错误处理与日志**:设置合适的错误处理机制,如使用`rescue_from`来捕获异常。合理使用Rails的日志功能,监控应用状态,便于问题排查。 11. **性能监控**:使用New Relic、Prometheus或自定义的性能指标监控...

    Learn Rails 5.2-2018

    学习如何编写控制器和动作,以及如何使用过滤器和异常处理。 9. **测试驱动开发(TDD)**:Rails鼓励使用测试来保证代码质量,本书将介绍RSpec和Capybara等测试工具的使用。 10. **部署与持续集成**:学习如何将...

    RJS Templates for Rails

    5. **错误处理**:Rails的异常处理机制同样适用于RJS模板,可以通过`rescue`来捕获并处理可能出现的错误。 6. **库集成**:RJS模板与Prototype库紧密集成,可以轻松调用Prototype库提供的函数,如Ajax请求和DOM操作...

    Ruby-Acl9一个Rails基于角色的授权系统

    如果权限不满足,Acl9会抛出异常,你可以捕获并处理这个异常来展示错误消息或重定向到其他页面。 6. **继承与嵌套**:Acl9支持角色之间的继承,这意味着你可以定义一个基础角色,然后让其他角色继承它的权限。此外...

    无线点餐系统的服务端,使用ruby on rails框架

    7. 错误处理和日志记录:通过使用如Rails的Action Controller的异常处理机制,确保系统在遇到问题时能够优雅地失败,并记录详细的错误日志供排查问题。 在"WirelessOrder-Server-master"这个压缩包中,可能包含了...

    Agile Web Development with Rails, 4th Edition, Rails 3.1

    - 书中还分享了许多来自实践经验的最佳实践建议,如安全性考虑、异常处理机制等,这些内容对于提高应用程序的整体质量和稳定性具有重要意义。 #### 三、结论 《敏捷Web开发与Rails》第四版以其全面而深入的内容、...

    Rails相关电子书汇总二

    4. **异常处理**:错误和异常处理机制,以及如何编写健壮的代码。 5. **测试驱动开发(TDD)**:Ruby支持TDD,书中会介绍如何使用Rake和Test::Unit进行测试。 6. **Gem和包管理**:Ruby的Gem系统,用于安装和管理外部...

    Rails2.0资料

    - **异常处理**:Rails 2.0引入了`rescue_from`机制,允许开发者更优雅地处理异常,并可以针对不同的异常类型采取不同的处理策略。 ##### 3.7 HTTP认证 - **HTTP认证**:为保护敏感API端点,Rails 2.0提供了HTTP...

Global site tag (gtag.js) - Google Analytics