[译] Ruby 2.6 Kernel 的system 方法增加是否抛出异常参数。

栏目: Ruby · 发布时间: 7年前

内容简介:本博客系列翻译自 Bigbinary 的Ruby 2.6 系列, 已得到作者允许。Ruby 2.6.0-preview2 现已发布。平时我们会写一些自动化设置和部署 Rails 应用的脚本。在这些脚本中,我们会时常使用系统命令,例如我们假设一下:我们需要在一个Rails 项目里头跑

本博客系列翻译自 Bigbinary 的 Ruby 2.6 系列, 已得到作者允许。Ruby 2.6.0-preview2 现已发布。

平时我们会写一些自动化设置和部署 Rails 应用的脚本。在这些脚本中,我们会时常使用系统命令,例如 bundle install ,抑或是 rake db:create 等等。

我们假设一下:我们需要在一个Rails 项目里头跑 rake db:migrate ,我们可以使用 Kernel#system 方法。

irb> system('rake db:migrate')
复制代码

Ruby 2.5.0

执行 system 方法会返回 true 或者 false (Ruby 2.5 下)。 system 其中一个Feature(థ౪థ) 就是他会把异常抛出给吃掉。

我们假设这个命令会成功,那么我们会得到返回值 true

irb> system('rake db:migrate')
 => true
复制代码

那我们继续假如:这个migration 尝试加一个字段到一个不存在的表里头。这个情况下,我们会得到返回值 false

irb> system('rake db:migrate')
== 20180311211836 AddFirstNameToAdmins: migrating =============================
-- add_column(:admins, :first_name, :string)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "admins" does not exist
: ALTER TABLE "admins" ADD "first_name" character varying
.
.
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
 => false
复制代码

如我们所见,即使执行系统命令失败,方法返回值还是会是 false 。Ruby 不会因此抛出异常。尽管如此,我们可以用这个方法来抛出异常。

irb> system('rake db:migrate') || raise('Failed to run migrations')
== 20180311211836 AddFirstNameToAdmins: migrating =============================
-- add_column(:admins, :first_name, :string)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "admins" does not exist
: ALTER TABLE "admins" ADD "first_name" character varying
.
.
.
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Traceback (most recent call last):
        2: from /Users/amit/.rvm/rubies/ruby-2.5.0/bin/irb:11:in `<main>'
        1: from (irb):4
RuntimeError (Failed to run migrations)
复制代码

Ruby 2.6.0-preview1

Ruby 2.6 给 system 方法提供了一个新的option, 也就是 exception ,你可以通过设置 exception: true 来让方法可以抛出异常。

irb> system('rake db:migrate', exception: true)
== 20180311211836 AddFirstNameToAdmins: migrating =============================
-- add_column(:admins, :first_name, :string)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "admins" does not exist
: ALTER TABLE "admins" ADD "first_name" character varying
.
.
.
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Traceback (most recent call last):
        3: from /Users/amit/.rvm/rubies/ruby-2.6.0-preview1/bin/irb:11:in `<main>'
        2: from (irb):2
        1: from (irb):2:in `system'
RuntimeError (Command failed with exit 1: rake)
复制代码

当然,你只要设置exception 为false,那么这个函数的行为就和以前一样,返回布尔值。

irb> system('rake db:migrate', exception: false)
== 20180311211836 AddFirstNameToAdmins: migrating =============================
-- add_column(:admins, :first_name, :string)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "admins" does not exist
: ALTER TABLE "admins" ADD "first_name" character varying
.
.
.
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
 => false
复制代码

这里是相关的 commit 和讨论。

system 也不是唯一可以执行这些语句的方法,我(作者)六年前写了一个博客讨论这些(执行系统命令)的方法的异同: backtick , exec , sh , popen3 , popen2e and Process.spawn .

原文地址


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员之禅

程序员之禅

[德] Christian Grobmeier / 荣耀、朱艳 / 人民邮电出版社 / 2015-8 / 39.00元

禅是一种生活态度和生活方式。程序员是一份特别辛苦的职业,也是一个承受各种压力的群体。在物欲横流的今天,禅对于程序员有着特殊的意义和价值。 本书的作者是一名德国程序员老兵,深谙程序员的喜怒哀乐。他曾经发表了一篇题为“程序员之禅的十条法则”的博客文章,引发众多程序员热烈的讨论和强烈的共鸣。本书共10章,结合程序员日常生活和工作的方方面面,作者通过对禅的知识、理解、体验、思考和感悟,提出很多中肯的......一起来看看 《程序员之禅》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具