SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
2013年4月13日
Ruby初級者向けレッスン 45回
— 例外 —
ひがき @ Ruby関西
お品書き
• エラーメッセージの読み方
• 例外を捕捉する
• 例外を起こす
エラーメッセージ
require ’open-uri’
open ’http://github.com/rubykansai/workshops/wiki’
.../open-uri.rb:223:in ‘open_loop’: redirection
forbidden: http://github.com/rubykansai/workshops/
wiki -> https://github.com/rubykansai/workshops/
wiki (RuntimeError)
from .../open-uri.rb:149:in ‘open_uri’
from .../open-uri.rb:688:in ‘open’
from .../open-uri.rb:34:in ‘open’
from ex.rb:2:in ‘<main>’
エラーメッセージと例外
アプリケーション ライブラリ A ライブラリ B
-
-
 例外対処
-
-
 例外異常終了
例外いろいろ TypeError
1 + 1
# ~ ex.rb:1:in ‘+’: can’t convert
Fixnum into String (TypeError)
# ~ from ex.rb:1:in ‘main’
例外いろいろ NoMethodError
1.to_sym
# ~ ex.rb:1:in ‘main’: undefined
method ‘to_sym’ for 1:Fixnum
(NoMethodError)
例外いろいろ NameError
n.times{puts ’Ruby!’}
# ~ ex.rb:1:in ‘main’: undefined
local variable or method ‘n’
for main:Object (NameError)
例外いろいろ NoMethodError (2)
n = ARGV.first.to_i unless ARGV.empty?
n.times{puts ’Ruby!’}
# ~ ex.rb:2:in ‘main’: undefined
method ‘times’ for nil:NilClass
(NoMethodError)
例外いろいろ Errno::ENOENT
open(’nothing.txt’)
# ~ ex.rb:1:in ‘initialize’:
No such file or directory -
nothing.txt (Errno::ENOENT)
# ~ from ex.rb:1:in ‘open’
# ~ from ex.rb:1:in ‘main’
例外いろいろ SyntaxError
def even?(n)
if n % 2 == 0
true
else
false
end
# ~ ex.rb:6: syntax error, unexpected
end-of-input, expecting keyword_end
Intelligence と Wisdom
雨が降ってきて…
• Intelligence
– 雨だ!
• Wisdom
– 傘を差そう
– 雨宿りしよう
例外を捕捉する コード例
files = %w[file.txt file1.txt file2.txt]
files.each do |fn|
begin
open(fn, ’w’){|f| f.puts ’Ruby!!’}
break
rescue = ex
$stderr.puts #{ex} (#{ex.class})
end
end
例外を捕捉する
begin
式1…
[rescue [型1[, 型2]…][= 変数][then]
式2…]…
[else
式3…]
[ensure
式4…]
end
例外を捕捉する コード例2
def fact(n)
n.factorial
rescue ArgumentError
1以上の整数を指定してください
rescue NoMethodError
整数を指定してください
end
例外の種類
puts NoMethodError.ancestors
#  NoMethodError
#  NameError
#  StandardError
#  Exception
#  Object
#  Kernel
#  BasicObject
rescue 修飾子
3.factorial rescue 0 # = 6
4.factorial rescue 0 # = 24
5.factorial rescue 0 # = 120
0.factorial rescue 0 # = 0
2.5.factorial rescue 0 # = 0
2.factorial rescue 0 # = 0
例外を起こす
raise simple
# ~ ex.rb:1:in ‘main’:
simple (RuntimeError)
例外を起こす クラス指定
raise ArgumentError, bad argument
# ~ ex.rb:1:in ‘main’:
bad argument (ArgumentError)
例外を起こす オブジェクト
raise TypeError.new(can’t convert...)
# ~ ex.rb:1:in ‘main’:
can’t convert... (TypeError)
例外を起こす 独自の例外クラス
class MyError  StandardError; end
raise MyError, ’original’
# ~ ex.rb:3:in ‘main’:
original (MyError)
演習問題 0
今日のレッスンで分からなかったこと、疑問に
思ったことをグループで話し合ってみよう。
演習問題 1
• いろいろな例外を発生させてみよう
def ex
yield
rescue
#{$!} (#{$!.class})
end
ex{1.to_sym} # = undefined method ‘to_sym’ fo
ex{1 + 1} # = String can’t be coerced into
演習問題 2
• いろいろな例外を発生させてみよう
– KeyError を捕捉しよう
– KeyError と StopIteration を捕捉しよう
演習問題 3
• デバッグしてみよう
– どんな例外が発生するか
– 本当は何をしたかったのか
– 修正してみよう
[0..9].map{|i| i * 2}
演習問題 4
• デバッグしてみよう
require ’./person’
matz = Person.new(’matz’, ’1965-04-14’)
matz.age
# ~ .../learn_ruby_kansai_57/person.rb:
14:in ‘age’: undefined method ‘strftime’
for 1965-04-14:String (NoMethodError)
# ~ from ex.rb:3:in ‘main’
自己紹介
• 名前 (ニックネーム)
• 普段の仕事・研究内容・代表作
• Ruby歴・コンピュータ歴
• 勉強会に来た目的
• などなど
参考
• るりま
http://doc.ruby-lang.org/ja/
• サンプルコード
https://github.com/higaki/
learn ruby kansai 57

Más contenido relacionado

La actualidad más candente

T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
Oda Shinsuke
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
Kenichirou Oyama
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
 
アプリコンテスト
アプリコンテストアプリコンテスト
アプリコンテスト
Tomonori Yamada
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Hisateru Tanaka
 
Node.js Error & Debug Leveling
Node.js Error & Debug LevelingNode.js Error & Debug Leveling
Node.js Error & Debug Leveling
kumatch kumatch
 
VisualVMの紹介
VisualVMの紹介VisualVMの紹介
VisualVMの紹介
tattyamm
 

La actualidad más candente (20)

0x300
0x3000x300
0x300
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
アプリコンテスト
アプリコンテストアプリコンテスト
アプリコンテスト
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 
Testman
TestmanTestman
Testman
 
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopmPerl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
 
Swift 2.0 変更点(だいたい)まとめ
Swift 2.0 変更点(だいたい)まとめSwift 2.0 変更点(だいたい)まとめ
Swift 2.0 変更点(だいたい)まとめ
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Node native ext
Node native extNode native ext
Node native ext
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
クライアント側でつかまえて
クライアント側でつかまえてクライアント側でつかまえて
クライアント側でつかまえて
 
Node.js Error & Debug Leveling
Node.js Error & Debug LevelingNode.js Error & Debug Leveling
Node.js Error & Debug Leveling
 
VisualVMの紹介
VisualVMの紹介VisualVMの紹介
VisualVMの紹介
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
spinsn - CPUの特殊命令の仕様推定と実装の競技
spinsn - CPUの特殊命令の仕様推定と実装の競技spinsn - CPUの特殊命令の仕様推定と実装の競技
spinsn - CPUの特殊命令の仕様推定と実装の競技
 
Your CiNii
Your CiNiiYour CiNii
Your CiNii
 
Your CiNii
Your CiNiiYour CiNii
Your CiNii
 

Similar a Ruby初級者向けレッスン 45回 ─── 例外

Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
Masahiro Tomita
 

Similar a Ruby初級者向けレッスン 45回 ─── 例外 (16)

Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 
【アシアル塾】PHPオブジェクト指向再入門・第三回Exceptionクラスによる例外処理
【アシアル塾】PHPオブジェクト指向再入門・第三回Exceptionクラスによる例外処理【アシアル塾】PHPオブジェクト指向再入門・第三回Exceptionクラスによる例外処理
【アシアル塾】PHPオブジェクト指向再入門・第三回Exceptionクラスによる例外処理
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
Haikara
HaikaraHaikara
Haikara
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道
 
ebisu.rb #19 超実践 super
ebisu.rb #19 超実践 superebisu.rb #19 超実践 super
ebisu.rb #19 超実践 super
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 

Más de higaki

Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と HashRuby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と Hash
higaki
 
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列
higaki
 

Más de higaki (11)

Ruby初級者向けレッスン 56回 ─── ブロック
Ruby初級者向けレッスン 56回 ─── ブロックRuby初級者向けレッスン 56回 ─── ブロック
Ruby初級者向けレッスン 56回 ─── ブロック
 
Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版
 
Ruby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスRuby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラス
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hash
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列
 
Ruby初級者向けレッスン 50回 ─── ブロック
Ruby初級者向けレッスン 50回 ─── ブロックRuby初級者向けレッスン 50回 ─── ブロック
Ruby初級者向けレッスン 50回 ─── ブロック
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
 
Ruby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラスRuby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラス
 
Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と HashRuby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と Hash
 
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列
 
ジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたジュンク堂書店の方から来ました
ジュンク堂書店の方から来ました
 

Último

Último (11)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

Ruby初級者向けレッスン 45回 ─── 例外