SlideShare a Scribd company logo
1 of 27
Download to read offline
Исключения и Ruby
Андрей Колешко
@ka8725
ka8725@gmail.com
Общие проблемы подхода к
разработке
Программируйте не на языке, а с помощью
языка.
С. Макконнелл
Проблемы исключений
Использование исключений в
неисключительных ситуациях
Пример
def create
@user = User.new params[:user]
@user.save!
redirect_to user_path(@user)
rescue ActiveRecord::RecordNotSaved
flash[:notice] = 'Unable to create user'
render :action => :new
end
Правильный подход
def create
@user = User.new params[:user]
if @user.save
redirect_to user_path(@user)
else
flash[:notice] = 'Unable to create user'
render :action => :new
end
end
Где использовать методы,
генерирующие исключения
• Могут быть полезны в тестах для
проверки валидаций
• В транзакциях для эмуляции отката
Где не использовать методы,
генерирующие исключения
• По возможности везде!
• Так или иначе, нам не избавиться от
случаев, когда без исключений не
обойтись
За что мы любим Ruby?
File.open('testfile') do |file|
while line = file.readline
puts line
end
rescue EOFError
return
end
Любили бы мы Ruby за это?
За что мы любим Ruby?
File.open('testfile') do |file|
while line = file.gets
puts line
end
end
Мы любим Ruby за это:
Примеры исключительных
ситуаций
• Потеря соединения с базой данных
• Переполнение памяти
• Ошибка чтения/записи сокета
Случаи, возникающие вследствии пользовательского
ввода НЕ являются исключительными ситуациями!
Должны ли мы отлавливать
исключительные ситуации?
• Все зависит от типа приложения и его
требований
• В большинстве случаев нет
• Любая строчка в коде может вызвать
исключение. Отлавливать все?
Не ловите все
user.address.street rescue ‘’
Не ловите все
user.address.street rescue ‘’
# а как насчет этого:
user.address.bla_bla_bla rescue ‘’
Будьте выразительнее
if user.address
user.address.street
end
Где может быть полезен
inline rescue?
val_or_error = {}.fetch(:name) rescue $!
val_or_error
#=> #<KeyError: key not found: :name>
Ловим исключение и анализируем его:
Не перехватывайте
Exception
class TaskProcessor
def perform(id)
task = Task.find(id)
task.process
rescue Exception => e
task.log(e.message)
raise
end
end
Результат
NoMethodError: undefined method `log' for nil:NilClass
Действительный
Ожидаемый
ActiveRecord::RecordNotFound: Couldn't find Task with
id=1000
Фикс
class TaskProcessor
def perform(id)
task = Task.find(id)
task.process
rescue ProcessError => e
task.log(e.message)
raise
end
end
Пути обхода
• Предоставляйте стратегию отступления
• Применяйте паттерны проектирования
• Пишите тесты
Сложность написания
теста укажет на плохо
спроектированную
систему
Hash#fetch
h = {}
h.fetch(:name) # =>KeyError: key not found: :name
h.fetch(:name) { 'ka8725' } # => "ka8725"
Обратная связь
def run
on_success do
# обработка успеха
end
on_failure do
# обработка ошибки
end
end
http://goo.gl/lchi1K
Throw/catch
def invoke
@res = catch(:halt) { yield }
# дальше анализ res
end
invoke { throw :halt, "response 1"}
@res #=> "response 1"
invoke { "response 2" }
@res #=> "response 2"
http://goo.gl/qey41F - исходники sinatra
Правило выбрасывания
исключений
Дейв Томас и Энди Хант,
Прагматик-программист
Литература
http://exceptionalruby.com/ http://eloquentruby.com/
http://pragprog.com/the-
pragmatic-programmer
http://cc2e.com/
Вопросы?
Андрей Колешко
@ka8725
ka8725@gmail.com

More Related Content

What's hot

Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС2ГИС Технологии
 
Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014Yandex
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Mikhail Davydov
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Fwdays
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Anton Arhipov
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...
Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...
Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...Lviv Startup Club
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Basis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkBasis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkMoscowJS
 
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)AvitoTech
 

What's hot (20)

Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
WTF Code @ jug.lv
WTF Code @ jug.lvWTF Code @ jug.lv
WTF Code @ jug.lv
 
Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...
Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...
Олексій Андрусевич “Прискорення робочого процесу в Adobe Photoshop за допомог...
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Basis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkBasis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA Framework
 
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
 
Basis.js - Production Ready Framework
Basis.js - Production Ready FrameworkBasis.js - Production Ready Framework
Basis.js - Production Ready Framework
 

Viewers also liked

Evaluation question 2
Evaluation question 2Evaluation question 2
Evaluation question 2jamiegibbins
 
Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890a1597
 
Question 2 from evaluation
Question 2 from evaluationQuestion 2 from evaluation
Question 2 from evaluationjamiegibbins
 
Baa adab baa muhaawara hoshiyaar ( Urdu humor) طنز ومزاح
Baa adab baa muhaawara hoshiyaar ( Urdu humor)  طنز ومزاحBaa adab baa muhaawara hoshiyaar ( Urdu humor)  طنز ومزاح
Baa adab baa muhaawara hoshiyaar ( Urdu humor) طنز ومزاحtabdeeli
 
Question 7 from evaluation
Question 7 from evaluationQuestion 7 from evaluation
Question 7 from evaluationjamiegibbins
 
Presentation147to158
Presentation147to158Presentation147to158
Presentation147to158andreahdzq
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890a1597
 
Живые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеЖивые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеSergey Mikhaylov
 
Atlas an overview sept2012
Atlas   an overview sept2012Atlas   an overview sept2012
Atlas an overview sept2012rahul_quantech
 
Atlas an overview sept2012
Atlas   an overview sept2012Atlas   an overview sept2012
Atlas an overview sept2012rahul_quantech
 
Food security bill
Food security billFood security bill
Food security billPANKAJMISHR
 

Viewers also liked (18)

Evaluation question 2
Evaluation question 2Evaluation question 2
Evaluation question 2
 
Exam
ExamExam
Exam
 
Rails3 way
Rails3 wayRails3 way
Rails3 way
 
Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890
 
Question 2 from evaluation
Question 2 from evaluationQuestion 2 from evaluation
Question 2 from evaluation
 
Baa adab baa muhaawara hoshiyaar ( Urdu humor) طنز ومزاح
Baa adab baa muhaawara hoshiyaar ( Urdu humor)  طنز ومزاحBaa adab baa muhaawara hoshiyaar ( Urdu humor)  طنز ومزاح
Baa adab baa muhaawara hoshiyaar ( Urdu humor) طنز ومزاح
 
Question 7 from evaluation
Question 7 from evaluationQuestion 7 from evaluation
Question 7 from evaluation
 
Presentation147to158
Presentation147to158Presentation147to158
Presentation147to158
 
Location shots
Location shotsLocation shots
Location shots
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Rails 3 assets pipeline
Rails 3 assets pipelineRails 3 assets pipeline
Rails 3 assets pipeline
 
Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890Basic format robeertaaa carrillooo5656767897890
Basic format robeertaaa carrillooo5656767897890
 
Complete ruby code
Complete ruby codeComplete ruby code
Complete ruby code
 
Живые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеЖивые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. Продвижение
 
Atlas an overview sept2012
Atlas   an overview sept2012Atlas   an overview sept2012
Atlas an overview sept2012
 
Atlas an overview sept2012
Atlas   an overview sept2012Atlas   an overview sept2012
Atlas an overview sept2012
 
Atlas - An Overview
Atlas - An OverviewAtlas - An Overview
Atlas - An Overview
 
Food security bill
Food security billFood security bill
Food security bill
 

Similar to Ruby exceptions

Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Levon Avakyan
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint Kyiv
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.Roman Brovko
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 

Similar to Ruby exceptions (20)

Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
запахи кода
запахи кодазапахи кода
запахи кода
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Worried code
Worried codeWorried code
Worried code
 
Worried code
Worried codeWorried code
Worried code
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
UI+unit testing in iOS
UI+unit testing in iOSUI+unit testing in iOS
UI+unit testing in iOS
 
Why Ruby?
Why Ruby?Why Ruby?
Why Ruby?
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 

Ruby exceptions