脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Ruby - Ruby中的异常处理代码编写示例

Ruby中的异常处理代码编写示例

2020-05-05 11:27脚本之家 Ruby

这篇文章主要介绍了Ruby中的异常处理代码编写示例,作者对异常处理的方式给出了一些比较通用的建议,需要的朋友可以参考下

单个异常使用 fail 关键字仅仅当捕获一个异常并且反复抛出这个异常(因为这里你不是失败,而是准确的并且故意抛出一个异常)。

?
1
2
3
4
5
begin
 fail 'Oops'
rescue => error
 raise if error.message != 'Oops'
end

    不要为 fail/raise 指定准确的 RuntimeError。

   

?
1
2
3
4
5
# bad
 fail RuntimeError, 'message'
 
 # good - signals a RuntimeError by default
 fail 'message'

    宁愿提供一个异常类和一条消息作为 fail/raise 的两个参数,而不是一个异常实例。

   

?
1
2
3
4
5
6
7
# bad
 fail SomeException.new('message')
 # Note that there is no way to do `fail SomeException.new('message'), backtrace`.
 
 # good
 fail SomeException, 'message'
 # Consistent with `fail SomeException, 'message', backtrace`.

    不要在 ensure 块中返回。如果你明确的从 ensure 块中的某个方法中返回,返回将会优于任何抛出的异常,并且尽管没有异常抛出也会返回。实际上异常将会静静的溜走。

  

?
1
2
3
4
5
6
7
def foo
  begin
   fail
  ensure
   return 'very bad idea'
  end
 end

    Use implicit begin blocks when possible.如果可能使用隐式 begin 代码块。

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# bad
 def foo
  begin
   # main logic goes here
  rescue
   # failure handling goes here
  end
 end
 
 # good
 def foo
  # main logic goes here
 rescue
  # failure handling goes here
 end

    通过 contingency methods 偶然性方法。 (一个由 Avdi Grimm 创造的词) 来减少 begin 区块的使用。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# bad
begin
 something_that_might_fail
rescue IOError
 # handle IOError
end
 
begin
 something_else_that_might_fail
rescue IOError
 # handle IOError
end
 
# good
def with_io_error_handling
  yield
rescue IOError
 # handle IOError
end
 
with_io_error_handling { something_that_might_fail }
 
with_io_error_handling { something_else_that_might_fail }

    不要抑制异常输出。

 

?
1
2
3
4
5
6
7
8
9
# bad
begin
 # an exception occurs here
rescue SomeError
 # the rescue clause does absolutely nothing
end
 
# bad
do_something rescue nil

    避免使用 rescue 的修饰符形式。

   

?
1
2
3
4
5
6
7
8
9
# bad - this catches exceptions of StandardError class and its descendant classes
 read_file rescue handle_error($!)
 
 # good - this catches only the exceptions of Errno::ENOENT class and its descendant classes
 def foo
  read_file
 rescue Errno::ENOENT => ex
  handle_error(ex)
 end

    不要用异常来控制流。

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# bad
 begin
  n / d
 rescue ZeroDivisionError
  puts "Cannot divide by 0!"
 end
 
 # good
 if d.zero?
  puts "Cannot divide by 0!"
 else
  n / d
 end

    应该总是避免拦截(最顶级的) Exception 异常类。这里(ruby自身)将会捕获信号并且调用 exit,需要你使用 kill -9 杀掉进程。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# bad
begin
 # calls to exit and kill signals will be caught (except kill -9)
 exit
rescue Exception
 puts "you didn't really want to exit, right?"
 # exception handling
end
 
# good
begin
 # a blind rescue rescues from StandardError, not Exception as many
 # programmers assume.
rescue => e
 # exception handling
end
 
# also good
begin
 # an exception occurs here
 
rescue StandardError => e
 # exception handling
end

    将更具体的异常放在救援(rescue)链的上方,否则他们将不会被救援。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# bad
begin
 # some code
rescue Exception => e
 # some handling
rescue StandardError => e
 # some handling
end
 
# good
begin
 # some code
rescue StandardError => e
 # some handling
rescue Exception => e
 # some handling
end

    在 ensure 区块中释放你程式获得的外部资源。

  

?
1
2
3
4
5
6
7
8
f = File.open('testfile')
 begin
  # .. process
 rescue
  # .. handle error
 ensure
  f.close unless f.nil?
 end

    除非必要, 尽可能使用 Ruby 标准库中异常类,而不是引入一个新的异常类。(而不是派生自己的异常类)

延伸 · 阅读

精彩推荐
  • RubyRuby简洁学习笔记(一):字符串、数字、类和对象

    Ruby简洁学习笔记(一):字符串、数字、类和对象

    这篇文章主要介绍了Ruby简洁学习笔记(一):字符串、数字、类和对象,本文是学习笔记第一篇,需要的朋友可以参考下 ...

    脚本之家2472020-04-20
  • RubyRuby进行文件信息输出实例代码

    Ruby进行文件信息输出实例代码

    Ruby进行文件信息输出实例代码,数据是随机的,所以每次的记录都会不同。 ...

    ruby教程网2962020-04-10
  • RubyRuby设计模式编程中使用Builder建造者模式的实例

    Ruby设计模式编程中使用Builder建造者模式的实例

    这篇文章主要介绍了Ruby设计模式编程中使用Builder建造者模式的实例,建造者模式将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表...

    范孝鹏2192020-05-07
  • RubyCentOS中配置Ruby on Rails环境

    CentOS中配置Ruby on Rails环境

    经过一个上午的折腾,终于把ROR环境在CentOS中搞定,绕了很多弯路,把文章写下来总结一下 ...

    可乐加糖4762020-04-12
  • RubyRuby迭代器的7种技巧分享

    Ruby迭代器的7种技巧分享

    这篇文章主要介绍了Ruby迭代器的7种技巧分享,Ruby中的迭代器非常人性化,本文既是讲解了7个技巧也是讲解了7种迭代器,需要的朋友可以参考下 ...

    脚本之家4782020-04-20
  • RubyRuby环境下安装使用bundler来管理多版本的gem

    Ruby环境下安装使用bundler来管理多版本的gem

    这篇文章主要介绍了Ruby环境下安装使用bundler来管理多版本的gem的方法,举了Ruby On Rails中的应用实例来进行演示,需要的朋友可以参考下 ...

    日拱一卒4332020-05-10
  • Ruby简要说明Ruby中的迭代器

    简要说明Ruby中的迭代器

    这篇文章主要介绍了Ruby中的迭代器,迭代器的概念在动态语言的编程中十分重要,文章中介绍了Ruby中的each迭代器和collect迭代器,需要的朋友可以参考下 ...

    goldensun2772020-04-25
  • Ruby剖析 Ruby 访问控制

    剖析 Ruby 访问控制

    前面,我们说 Ruby 没有函数,只有方法.而且实际上有不止一种方法.这一节我们介绍 访问控制 (accesscontrols). 想想当我们在最高层而不是在一个类的定义里定义...

    ruby教程网3572020-04-08