Ruby の 定番対話ツール pry 徹底攻略 | Exception handling #pry #ruby


# Ruby の 定番対話ツール pry 徹底攻略 | :baby_chick::baby_chick::bird::baby_chick::baby_chick: Exception handling
## :musical_score: 概要
Ruby の 定番対話ツール pry 徹底攻略
Exception handling について

## :baby_chick::baby_chick::bird::baby_chick::baby_chick: Exception handling
pry はあなたのコードで起こったほとんどの例外をキャッシュしている。
そのため、何が間違っていたか原因を突き止め、問題をなおす助力となる。

## :station: The `_ex_` local variable
pry は一番最後に発生した例外を `_ex_` というローカル変数に保持している。

`_ex_` に関する詳細については
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略 | The special locals](http://qiita.com/tbpgr/items/5204c07034854ed0b7b8#local-name-_ex_) を参照

## :deciduous_tree: Using the `wtf?` command
`_ex_` の代替として `wtf?` を利用することもできます。
wtf という言葉についてググったのですが、これですかね？
"what the :fu:?" : "何だ一体？"

`wtf?` に関する詳細については
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略 | The special locals](http://qiita.com/tbpgr/items/5204c07034854ed0b7b8#wtf-command) を参照

## :scream_cat: Using the `cat --ex` command
`cat --ex` でエラーが発生した行をシンタックスハイライト付きで表示します。

### シンタックスハイライトの確認
![color.png](https://qiita-image-store.s3.amazonaws.com/0/43480/7055a544-16a6-512d-36de-dea5ab0d0796.png)

### スタック階層の指定
引数に数値 N を指定することで、例外発生時の任意の階層を確認できます

* 対象コード

~~~ruby
def hoge1
  hoge2
end

def hoge2
  hoge3
end

def hoge3
  raise "error"
end

hoge1
~~~

* 実行確認

~~~
$ pry -I ./hoge.rb
[3] pry(main)> edit hoge.rb
RuntimeError: error
from /path/to/current/hoge.rb:10:in `hoge3'
[3] pry(main)> hoge1
RuntimeError: error
from /path/to/current/hoge.rb:10:in `hoge3'

# N 指定なしで呼び出し
[4] pry(main)> cat --ex

Exception: RuntimeError: error
--
From: /path/to/current/hoge.rb @ line 10 @ level: 0 of backtrace (of 30).

     5: def hoge2
     6:   hoge3
     7: end
     8:
     9: def hoge3
 => 10:   raise "error"
    11: end
~~~

~~~
# N=1 で呼び出し
[5] pry(main)> cat --ex 1

Exception: RuntimeError: error
--
From: /path/to/current/hoge.rb @ line 6 @ level: 1 of backtrace (of 30).

     1: def hoge1
     2:   hoge2
     3: end
     4:
     5: def hoge2
 =>  6:   hoge3
     7: end
~~~

~~~
# N=2 で呼び出し
[6] pry(main)> cat --ex 2

Exception: RuntimeError: error
--
From: /path/to/current/hoge.rb @ line 2 @ level: 2 of backtrace (of 30).

    1: def hoge1
 => 2:   hoge2
    3: end
    4:
    5: def hoge2
    6:   hoge3
    7: end
~~~

~~~
# N=3 で呼び出し
[7] pry(main)> cat --ex 3

Exception: RuntimeError: error
--
From: (pry) @ line 2 @ level: 3 of backtrace (of 30).

    1: hoge1
 => 2: hoge1
[8] pry(main)>
~~~

## <i class="fa fa-gear" style="font-size:1em;"></i>:pouting_cat: Configuring `cat --ex`
`cat --ex` は、デフォルトで 5 行の出力を行います。
出力行数を変更したい場合は、 `Pry.config.default_window_size` を設定します。

`Pry.config.default_window_size` に関する詳細については
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略 | Customization and configuration](http://qiita.com/tbpgr/items/d3c9651ac9e35af8b377#-the-exception-window-size) を参照

## <i class="fa fa-edit" style="font-size:1em;"></i> Using the `edit --ex` command
`edit --ex` で、最後にエラーが発生した処理の該当ファイル・該当行から編集を始めることができます。
`cat --ex N` と同様に `edit --ex N` で任意の階層を指定することもできます。
これにより、エラー原因の素早い修正が可能になります。

## :sound::seat::wrench::car: Customising the exception handler
pry が例外を補足した時、デフォルトではあなたがのぞむ十分な情報ではないと感じるかもしれません。
`Pry.config.exception_handler` に独自の例外情報の出力設定を行うことで、自分好みの内容にすることができます。

`Pry.config.exception_handler` に関する詳細については
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略 | Customization and configuration](http://qiita.com/tbpgr/items/d3c9651ac9e35af8b377#pryrc-%E3%81%A7-pryconfigoutput-%E3%82%92%E8%A8%AD%E5%AE%9A-1) を参照

## <i class="fa fa-gears" style="font-size:1em;"></i> Configuring which exceptions are caught
pry は whitelist によって、あえて補足しない例外を管理することができます。
デフォルトではこれによって、 SystemExit などが無視されています。
whitelist は ` Pry.config.exception_whitelist` で設定可能です。

`Pry.config.exception_whitelist` に関する詳細については
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略 | Customization and configuration](http://qiita.com/tbpgr/items/d3c9651ac9e35af8b377#-the-exception-whitelist) を参照

## :police_car: The pry-rescue plugin
よりパワフルな例外ハンドリング機能は、 <i class="fa fa-external-link" style="font-size:1em;"></i> [pry-rescue](https://github.com/conradirwin/pry-rescue) にある！
と、公式に書いてあったので確認したら、 pry-rescue の Travis CI のテストが Fail していた。
不安を覚えつつ動作確認してみましたが、公式ページのサンプル通りに動かなかったので確認を切り上げます。

## :man::woman: 親記事
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略](http://qiita.com/tbpgr/items/12a60f2f9e3de61517b5)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [pry Wiki | Exception handling](https://github.com/pry/pry/wiki/Exceptions)
* <i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-github-square" style="font-size:1em;"></i> [pry-rescue GitHub](https://github.com/conradirwin/pry-rescue)