`
s8186255
  • 浏览: 85550 次
  • 性别: Icon_minigender_1
  • 来自: 新疆乌鲁木齐
社区版块
存档分类
最新评论

全局范围内捕捉错误

阅读更多

     使用begin rescue else end这种句法是ruby编程的常用方法。但是每个在涉及到查询的过程中都需要使用这个繁杂的语句,简直让人崩溃。

     不让人崩溃的方法就是如何写一遍,可以让所有的凡是可能碰到类似错误的action都可以一种优雅的方式提示错误。这就是我们的目标。

     通过搜索,看到rescue_from这个rails定义的方法,再通过console查询,发现它在ActionController模块的Base类中。它可以捕捉action执行过程中的错误。

     如果是查不着记录,比如使用find(5),这样的语句,如果模型中没有这条记录,则会出现ActiveRecord::Error not found error这样的错误,这种错误,我们可以在application_controller这个全局控制器中定义这样一个拯救方法:

rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

或者如果发生路由错误,我们可以再增加一个rescue_from

rescue_from ActionController::RoutingError,:with=> :record_not_found


说明:

1、rescue_from后面第一个参数是错误类型,随着逐步了解rails的错误体系,可以在这里写更多的rescue,直到你消灭所有不可控的错误。

2、第二个参数是一个hash,record_not_found是一个处理方法,也就是错误来了,我要干什么。

简单定义record_not_found如下,最好放在protected或者private下:

def record_not_found

render :text=>'呵呵,你怎么又出错了'

end


这样做了以后,我们的action中就可以大胆的使用find(id)这样的语句,二不怕出错,或者当用户在url中进行任意篡改的时候,我们也心中有数,不至于使用public目录下的错误提醒代码,用红色message吓坏使用者了。



0
0
分享到:
评论
1 楼 wejaylyn 2011-03-18  
貌似rails 3.0.x里的scue_from ActionController::RoutingError是不成功的,会在rails 3.1里修复;但是我在试的时候AbstractController::ActionNotFound也不会捕获成功,不知到神马情况

相关推荐

    超级有影响力霸气的Java面试题大全文档

    Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨...

    《javaScrip开发技术大全》源代码

    • sample19.htm 一段错误的JavaScript代码(调试用) 第3章(\代码\第03章) • sample01.htm 转换成数字型 第4章(\代码\第04章) • sample01.htm 字符串直接量 • sample02....

    JavaScript王者归来part.1 总数2

     1.2 JavaScript的应用范围   1.3 JavaScript的版本   1.4 一些值得留意的特性 禁忌及如何突破这些禁忌   1.5 安全性和执行效率   1.6 一个例子--JavaScript编写的计算器   1.7 学习和使用JavaScript的...

    你必须知道的495个C语言问题

    2.9 为什么不能用内建的==和!=操作符比较结构? 2.10结构传递和返回是如何实现的? 2.11 如何向接受结构参数的函数传入常量值?怎样创建无名的中间的常量结构值? 2.12 怎样从/向数据文件读/写结构? 结构...

    《你必须知道的495个C语言问题》

    2.9 为什么不能用内建的==和!=操作符比较结构? 26 2.10 结构传递和返回是如何实现的? 26 2.11 如何向接受结构参数的函数传入常量值?怎样创建无名的中间的常量结构值? 26 2.12 怎样从/向数据文件读/写结构...

    windowsnt 技术内幕

    Windows NT网络服务简介 DHCP简介 理解DHCP需求 理解DHCP处理DHCP范围的创建和配置 设置DHCP范围选项 WINS简介 理解WINS需求 理解WINS配置 DNS简介 理解DNS区 创建DNS主机记录 配置DNS服务器转发客户端请求 创建DNS...

    java 面试题 总结

    Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨...

    ZendFramework中文文档

    7.8.4. 内建的动作助手 7.8.4.1. 动作堆栈(助手) 7.8.4.2. AutoComplete 7.8.4.2.1. AutoCompletion with Dojo 7.8.4.2.2. AutoCompletion with Scriptaculous 7.8.4.3. ContextSwitch and AjaxContext 7.8....

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    实际上,封装在程序和数据之间设置了一道栅栏,它可以阻止一部分的设计错误,不至 于涉足应用程序其他部分的数据。 2.2.3 消息 一个单独的对象一般不十分有用,而作为一员出现在包含有许多其他对象的大...

    Visual C++编程技巧精选500例.pdf

    318 如何获取Windows的内建号? 319 如何获取Windows的版本名称? 320 如何获取当前文件夹的位置? 321 如何获取文件夹的根目录位置? 322 如何获取文件夹的上层目录位置? 323 如何获取文件夹中的所有文件? 324 如何...

Global site tag (gtag.js) - Google Analytics