异常处理代码优化

异常处理基本就是 begin/rescue/end的代码块,运用下面三个策略,代码结构就比较清晰。

  • 优先使用顶层异常捕获
def foo
  # 其他逻辑  
  begin
    # 抛出异常的代码
  rescue
    #异常处理
  end
end

# 修改为
def foo
  # 主逻辑
rescue
  # 异常处理
end

# 用受检方法封装异常操作
def filter_through_pipe
  IO.popen(command,'w+') do |process|
    result = begin
      process.write(message)
      process.close_write
      process.read
    rescue Error:EPIPE
      message
    end
  end
end

#修改为

def check_popen(command, mode, error_policy = -> {raise})
  IO.popen(command,mode) do |process|
    return yield(process)
  end
rescue Error::EPIPE
  error_policy.call
end

def filter_through_pipe(command,message)
  checked_popen(command,'w+', -> {message}) do |process|
    process.write(message)
    process.close_write
    process.read
  end
end
  • 使用护卫方法(较少使用)
    使用状态替代异常,根据状态码统一处理。需要使用子进程处理可抛异常逻辑,根据子进程返回码判断状态

推荐阅读更多精彩内容

  • 第二日凤九迷迷糊糊睁眼已经是中午,看到的是那张俊俏的脸,腾地,凤九突然意识到了什么?坐了起来…怎么了九儿?东...
    帝君的九儿阅读 2,501评论 5 17
  • 这一篇我觉得不只是写给自己的,其实大家也可以参考一下。 同龄人为什么往往都比自己优秀,生活比较好。可能是他们的一个...
    鹤楷阅读 2,479评论 6 142
  • 真没有骗你,如标题所示,大学没有参加任何学生会,你问我后悔吗?快问。 大学没加入学生会,你后悔吗? 一点点后悔吧,...
    飒飒丫头子阅读 1,760评论 12 80
  • 今天是日更的第十二天,还记得第一天的时候,也不知道要写什么,只是恰巧当时心里有事,想记录下来。 简书真是个非常好的...
    暮光谷阅读 5,782评论 50 277
  • 也不知道怎么回事,毕业之后好像丧失了所有的兴趣,前途一片渺茫。 一次偶然的机会,还是入驻了简书,这么说吧,从开始到...
    梓怡77阅读 12,310评论 67 546