六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 36|回复: 0

rails异常(错误)处理

[复制链接]

升级  39.33%

29

主题

29

主题

29

主题

秀才

Rank: 2

积分
109
 楼主| 发表于 2013-2-7 16:49:26 | 显示全部楼层 |阅读模式
方法1:http://www.uedidea.com/rails%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86.html
 
def add_to_cartproduct = Product.find(params[:id])rescue ActiveRecord::RecordNotFound #拦截Product.find()异常logger.error("Attempt to access invalid product #{params[:id]}") #日志记录flash[:notice] = "Invalid product" #notice 存放提示信息redirect_to :action => "index" #跳转到indexendbegin   @user.destroy    flash[:notice] = "User #{@user.name} deleted"rescue Exception => e #如果上面的代码执行发生异常就捕获   flash[:notice] = e.messageend 
begin  raise ArgumentError, "Bad data"rescue => err   puts err ensure...                       #执行清理工作 end   


方法2:around_filter  

http://hlee.iteye.com/blog/323025
 
    around_filter :rescue_record_not_found                 def rescue_record_not_found           begin             yield           rescue ActiveRecord::RecordNotFound             render :file => "#{RAILS_ROOT}/public/404.html"          end         end     

   hlee 在文中还提到可以这样做:
    rescue_from ActiveRecord::RecordNotFound, with => :rescue_record_not_found                 def rescue_record_not_found           render :file => "#{RAILS_ROOT}/public/404.html"        end     方法3:rescue_action_in_public



参考:http://202.199.224.30/post/article/7
    def rescue_action_in_public(exception)              logger.error("rescue_action_in_public executed")              case exception              when ActiveRecord::RecordNotFound, ::ActionController::RoutingError,                  ::ActionController::UnknownAction                logger.error("404 displayed")                render(:file  => "#{RAILS_ROOT}/public/404.html",                :status   => "404 Not Found")              else                logger.error("500 displayed")                render(:file  => "#{RAILS_ROOT}/public/500.html",                :status   => "500 Error")          #      SystemNotifier.deliver_exception_notification(self, request,            #                                                    exception)              end            end     


   注意:在不同环境中的配置,生产环境中,默认的配置应该就可以显示效果,但在开发模式下,需要确认/config/environments/development.rb中的



代码

config.action_controller.consider_all_requests_local = false    
如果在本机访问必须增加(app/controllers/application.rb):



代码
def local_request?   false end   
错误类型参考:

    DEFAULT_RESCUE_RESPONSE = :internal_server_error      DEFAULT_RESCUE_RESPONSES = {        'ActionController::RoutingError'             => :not_found,        'ActionController::UnknownAction'            => :not_found,        'ActiveRecord::RecordNotFound'               => :not_found,        'ActiveRecord::StaleObjectError'             => :conflict,        'ActiveRecord::RecordInvalid'                => :unprocessable_entity,        'ActiveRecord::RecordNotSaved'               => :unprocessable_entity,        'ActionController::MethodNotAllowed'         => :method_not_allowed,        'ActionController::NotImplemented'           => :not_implemented,        'ActionController::InvalidAuthenticityToken' => :unprocessable_entity      }            DEFAULT_RESCUE_TEMPLATE = 'diagnostics'      DEFAULT_RESCUE_TEMPLATES = {        'ActionView::MissingTemplate'       => 'missing_template',        'ActionController::RoutingError'    => 'routing_error',        'ActionController::UnknownAction'   => 'unknown_action',        'ActionView::TemplateError'         => 'template_error'      }   


又看了这篇贴子中的讨论:http://www.iteye.com/topic/708334
rails的错误处理还需要再研究。
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表