Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Catch and Throw in Ruby
Search
Aliaksandr Lomau
July 18, 2018
Technology
62
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Catch and Throw in Ruby
Rubizza Camp Fire, July 2018
Aliaksandr Lomau
July 18, 2018
More Decks by Aliaksandr Lomau
See All by Aliaksandr Lomau
Fails Night
allomov
0
65
"Ya Ne Lochu Comp" Challenge.
allomov
1
100
Mortal Rubizza
allomov
0
110
Рэмбовидная проблема: особенности развития открытых технологий
allomov
0
68
Vault-tec: Safest Future
allomov
0
290
Promises and Reality
allomov
1
69
Cloud Theory for Rubizza Classes
allomov
0
100
Антология деплоя
allomov
0
94
Not For Recording: BOSH User Life Stories
allomov
0
97
Other Decks in Technology
See All in Technology
少人数データチームのDevin活用実践事例
runandy16
2
450
Deploying a Full-Stack Bun-Native Framework on Cloudflare Workers
7nohe
0
110
データエンジニアの困りごとをDevinと一緒に解消する
10xinc
2
860
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
310
2026/09/10 Spring_Bootから_Jakarta_EE_MicroProfileへの移行
megascus
0
230
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
550
Snowflakeで実現する全社横断の顧客の声(VOC)分析・活用基盤@Snowflake World Tour Tokyo 2026
yuto16
0
110
振り返りこそエンジニアの本領
negima
0
340
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.3k
Benchmarking Vector Databases: pgvector vs. LanceDB
tsho
0
150
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
230
AI-DLCって実際どう? 〜聞きたいこと全部聞いてみる〜
news_it_enj
0
240
Featured
See All Featured
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
Paper Plane (Part 1)
katiecoart
PRO
1
11k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
510
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
How to make the Groovebox
asonas
2
2.4k
Automating Front-end Workflow
addyosmani
1369
210k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
450
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
Building AI with AI
inesmontani
PRO
1
1.2k
ラッコキーワード サービス紹介資料
rakko
1
4.8M
Transcript
None
Alialksandr Lomau VETERANT EL “CAPITAN” DEPLOY https://speakerdeck.com/allomov https://twitter.com/code1n
They can be everywhere!
None
None
None
None
These Pokemons Are ...
None
None
None
None
Variable is not initialized
Variable is not initialized Wrong argument type
Variable is not initialized Wrong argument type File does not
exist
Variable is not initialized Wrong argument type File does not
exist Not enough memory
Variable is not initialized Wrong argument type File does not
exist Not enough memory water pokemon is definitely a memory leak
Ruby == Minefield
Ruby == Minefield
Catche Pokemon with Pokeball
None
== Exception Class
None
rescue SomeError => e # ... end rescue
rescue SomeError, SomeOtherError => e # ... end multiple rescue
rescue SomeError => e # ... rescue SomeOtherError => e
# ... end stacking rescue
rescue rescue # ... end # is equivalent to: rescue
StandardError # ... end
rescue
rescue rescue Exception => e # ... end
rescue rescue => error # ... end # is equivalent
to: rescue StandardError => error # ... end
rescue begin raise "Timeout while reading from socket" rescue errors_with_message(/socket/)
puts "Ignoring socket error" end
rescue def errors_with_message(pattern) m = Module.new m.singleton_class.instance_eval do define_method(:===) do
|e| pattern === e.message end end m end
raise raise(exception_class_or_object, message, backtrace)
raise raise # is equivalent to: raise RuntimeError
raise raise 'An error has occured.' # is equivalent to
: raise RuntimeError, 'An error has occured.'
raise raise RuntimeError, 'An error has occured.' # is equivalent
to : raise RuntimeError.new('An error has occured.')
raise raise RuntimeError, 'An error' # is equivalent to :
raise RuntimeError, 'An error', caller(0)
caller 2.4.2 :005 > puts caller(0).join("\n") (irb):5:in `irb_binding' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/workspace.rb:87:in `eval'
/Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/workspace.rb:87:in `evaluate' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/context.rb:381:in `evaluate' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:493:in `block (2 levels) in eval_input' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:627:in `signal_status' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:490:in `block in eval_input' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/ruby-lex.rb:232:in `loop' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/ruby-lex.rb:232:in `block in each_top_level_sta /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/ruby-lex.rb:231:in `catch' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb/ruby-lex.rb:231:in `each_top_level_statement' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:489:in `eval_input' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:430:in `block in run' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:429:in `catch' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:429:in `run' /Users/allomov/.rvm/rubies/ruby-2.4.2/lib/ruby/2.4.0/irb.rb:385:in `start' /Users/allomov/.rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>' => nil
global variable •$! •$ERROR_INFO note: set it to nil to
rescue exception
ensure begin # do something raise 'An error has occured.'
rescue => e puts 'I am rescued.' ensure puts 'This code always is executed.' end
retry tries = 0 begin tries += 1 puts "Trying
#{tries}..." raise "Didn't work" rescue retry if tries < 3 puts "I give up" end
else begin yield rescue puts "Only on error" else puts
"Only on success" ensure puts "Always executed" end
• Use exception when you need • Wrap exception when
re-raising • Avoid raising during ensure • Exception is your method interface too • Classify your exceptions • Readable exceptional code • Declare classes for app exception good points
Benchmarks
Circuit Breaker pattern
Anti-Patterns • Exceptions controlled flow • rescue nil
What to do with errors? • handle them • send
emails with them • send them to error report system • errbit • pappertrail • elk • … etc.
Alternatives • Callbacks on fails (JavaScript) • Promises (JavaScript) •
Returning codes (golang)
None
None
None
To Know More
throw "End"