SlideShare a Scribd company logo
1 of 11
Download to read offline
Scalaでの例外
                              @kawachi


Thursday, January 17, 13
自己紹介
                • 最近興味のあること

                      • Scala, TypeScript, iOS, golang, etc.

                • 興味のままに 将来性のあるプラットフォームで仕事
                      したい!

                      • Scala + Elastic Beanstalk + TypeScript でお仕事中
                           (先週末から)


Thursday, January 17, 13
Scalaとの出会い
                • 昨年10月

                • 「Rubyのプログラムが遅いよ∼」

                • 「Scalaっていうのがあるよ」

                • 6倍速に

                • 現在 Scala 歴1ヶ月


Thursday, January 17, 13
Scalaでの例外処理
                • No checked exception

                • サボりがちですが、
                      別に起きなくなったわけじゃありません

                • Blog記事(Error Handling in Scala)の内容を紹介
                      http://tersesystems.com/2012/12/27/error-
                      handling-in-scala


Thursday, January 17, 13
try, catch, finally
                                            ~基本~
                • Java と同じ

                • catch は PartialFunction で書く

                           try {
                             f() // throw new MyException()
                           } catch {
                             case e: MyException => ...
                           } finally {
                             ...
                           }




Thursday, January 17, 13
Option
                     ~NullPointerException からの卒業~
                • 値が無いかもしれないことを型で表現

                • Some(A) or None

                • Option の敵 → Some(null)
                      Some(possiblyNull) ではなく Option(possiblyNull)

                • 使い方はコレクションっぽい。Cheat sheet 参照

                      • http://blog.tmorris.net/posts/scalaoption-cheat-sheet/



Thursday, January 17, 13
Either
                                         ~エラー応答~
                • Left[L] or Right[R]

                • Rightに成功応答、Leftにエラー応答

                • ネストが深くなる傾向あり (Either[A,Either[B,...]])
                           def f(): Either[FailResult, String] =
                             if (...)
                               Right("abc")
                             else
                               Left(FailResult("failed"))

                           f().fold(
                             error => ...,
                             success => ...
                           )

Thursday, January 17, 13
Try                    New in 2.10
                                                                  From twitter.util
                                 ~Wrap Throwable~
                • Failure[Throwable] or Success[T]

                • 例外を包む

                • スタックをまたげる → 非同期プログラミング

                           object Try {
                             def apply[T](r: => T): Try[T] =
                               try Success(r) catch {
                                 case NonFatal(e) => Failure(e)
                               }
                           }


Thursday, January 17, 13
Try の使い方
                           import util.Try
                           val sumTry = for {
                             int1 <- Try(Integer.parseInt("1"))
                             int2 <- Try(Integer.parseInt("2"))
                           } yield {
                             int1 + int2
                           }
                           sumTry match {
                             case Failure(e) => e.printStackTrace()
                             case Success(v) => println(v)
                           }




Thursday, January 17, 13
失敗からのrecover

                • Failure[Throwable] を Success[T] へ


                           var v: Try[Int]
                           val r: Try[Int] = v.recover {
                             case e: MyException => 100
                           }




Thursday, January 17, 13
まとめ
                • 基本は try, catch, finally

                • Option を使えば NullPointerException がなくなる

                • エラー応答を返したいときは Either

                • 例外を包む時はTry

                      • Futureを使った非同期プログラミングのお供に


Thursday, January 17, 13

More Related Content

What's hot

不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」PHPの教室「foreachを極める」
PHPの教室「foreachを極める」Yusuke Ando
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32kikairoya
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Takashi Hoshino
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshTomofumi Hayashi
 
Control.Arrow
Control.ArrowControl.Arrow
Control.Arrowharu haru
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosTomohiro Kumagai
 
Haskellの型安全性の力よ〜参照透明性編〜
Haskellの型安全性の力よ〜参照透明性編〜Haskellの型安全性の力よ〜参照透明性編〜
Haskellの型安全性の力よ〜参照透明性編〜aiya000
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
静的型付け言語Python
静的型付け言語Python静的型付け言語Python
静的型付け言語Pythonkiki utagawa
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiTomohiro Kumagai
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idiomsfimbul
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascriptRyuma Tsukano
 

What's hot (20)

不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
Go guide for Java programmer
Go guide for Java programmerGo guide for Java programmer
Go guide for Java programmer
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」PHPの教室「foreachを極める」
PHPの教室「foreachを極める」
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 
Control.Arrow
Control.ArrowControl.Arrow
Control.Arrow
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
Haskellの型安全性の力よ〜参照透明性編〜
Haskellの型安全性の力よ〜参照透明性編〜Haskellの型安全性の力よ〜参照透明性編〜
Haskellの型安全性の力よ〜参照透明性編〜
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
静的型付け言語Python
静的型付け言語Python静的型付け言語Python
静的型付け言語Python
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
 
20081120 lt11th ace
20081120 lt11th ace20081120 lt11th ace
20081120 lt11th ace
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idioms
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascript
 

Viewers also liked

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングTanUkkii
 
【アジャイルサムライ】6章_ユーザストーリーを集める
【アジャイルサムライ】6章_ユーザストーリーを集める【アジャイルサムライ】6章_ユーザストーリーを集める
【アジャイルサムライ】6章_ユーザストーリーを集めるAkio Terayama
 
XP祭り2014「アジャイルを手放して得られたこと」
XP祭り2014「アジャイルを手放して得られたこと」 XP祭り2014「アジャイルを手放して得られたこと」
XP祭り2014「アジャイルを手放して得られたこと」 Yusuke Suzuki
 
【6章】アジャイルサムライ お題
【6章】アジャイルサムライ お題【6章】アジャイルサムライ お題
【6章】アジャイルサムライ お題Akio Terayama
 
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テストmakopi 23
 
スクラムの知られざる勘所
スクラムの知られざる勘所スクラムの知られざる勘所
スクラムの知られざる勘所Yoshifumi Tsuda
 
なぜアジャイル開発はうまくいかないのか #xpjug
なぜアジャイル開発はうまくいかないのか #xpjugなぜアジャイル開発はうまくいかないのか #xpjug
なぜアジャイル開発はうまくいかないのか #xpjugYoshihito Kuranuki
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計増田 亨
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?増田 亨
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 

Viewers also liked (13)

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
 
【アジャイルサムライ】6章_ユーザストーリーを集める
【アジャイルサムライ】6章_ユーザストーリーを集める【アジャイルサムライ】6章_ユーザストーリーを集める
【アジャイルサムライ】6章_ユーザストーリーを集める
 
XP祭り2014「アジャイルを手放して得られたこと」
XP祭り2014「アジャイルを手放して得られたこと」 XP祭り2014「アジャイルを手放して得られたこと」
XP祭り2014「アジャイルを手放して得られたこと」
 
【6章】アジャイルサムライ お題
【6章】アジャイルサムライ お題【6章】アジャイルサムライ お題
【6章】アジャイルサムライ お題
 
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
 
スクラムの知られざる勘所
スクラムの知られざる勘所スクラムの知られざる勘所
スクラムの知られざる勘所
 
なぜアジャイル開発はうまくいかないのか #xpjug
なぜアジャイル開発はうまくいかないのか #xpjugなぜアジャイル開発はうまくいかないのか #xpjug
なぜアジャイル開発はうまくいかないのか #xpjug
 
文書をコードとして扱う
文書をコードとして扱う文書をコードとして扱う
文書をコードとして扱う
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 

More from Takashi Kawachi

例外のlogを快適に
例外のlogを快適に例外のlogを快適に
例外のlogを快適にTakashi Kawachi
 
最小 Hello World! チャレンジ
最小 Hello World! チャレンジ最小 Hello World! チャレンジ
最小 Hello World! チャレンジTakashi Kawachi
 
Elastic beanstalk と Docker と Play
Elastic beanstalk と Docker と PlayElastic beanstalk と Docker と Play
Elastic beanstalk と Docker と PlayTakashi Kawachi
 
やさしいIteratee入門
やさしいIteratee入門やさしいIteratee入門
やさしいIteratee入門Takashi Kawachi
 
Haskell超初心者勉強会20
Haskell超初心者勉強会20Haskell超初心者勉強会20
Haskell超初心者勉強会20Takashi Kawachi
 
Haskell超初心者勉強会17
Haskell超初心者勉強会17Haskell超初心者勉強会17
Haskell超初心者勉強会17Takashi Kawachi
 
Haskell超初心者勉強会14
Haskell超初心者勉強会14Haskell超初心者勉強会14
Haskell超初心者勉強会14Takashi Kawachi
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11Takashi Kawachi
 

More from Takashi Kawachi (12)

例外のlogを快適に
例外のlogを快適に例外のlogを快適に
例外のlogを快適に
 
MacroPyがすごい
MacroPyがすごいMacroPyがすごい
MacroPyがすごい
 
Silhouette intro
Silhouette introSilhouette intro
Silhouette intro
 
最小 Hello World! チャレンジ
最小 Hello World! チャレンジ最小 Hello World! チャレンジ
最小 Hello World! チャレンジ
 
Sbt doctest
Sbt doctestSbt doctest
Sbt doctest
 
Elastic beanstalk と Docker と Play
Elastic beanstalk と Docker と PlayElastic beanstalk と Docker と Play
Elastic beanstalk と Docker と Play
 
やさしいIteratee入門
やさしいIteratee入門やさしいIteratee入門
やさしいIteratee入門
 
Sbt lock1
Sbt lock1Sbt lock1
Sbt lock1
 
Haskell超初心者勉強会20
Haskell超初心者勉強会20Haskell超初心者勉強会20
Haskell超初心者勉強会20
 
Haskell超初心者勉強会17
Haskell超初心者勉強会17Haskell超初心者勉強会17
Haskell超初心者勉強会17
 
Haskell超初心者勉強会14
Haskell超初心者勉強会14Haskell超初心者勉強会14
Haskell超初心者勉強会14
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 

Recently uploaded

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 

Recently uploaded (12)

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 

Scalaでの例外処理

  • 1. Scalaでの例外 @kawachi Thursday, January 17, 13
  • 2. 自己紹介 • 最近興味のあること • Scala, TypeScript, iOS, golang, etc. • 興味のままに 将来性のあるプラットフォームで仕事 したい! • Scala + Elastic Beanstalk + TypeScript でお仕事中 (先週末から) Thursday, January 17, 13
  • 3. Scalaとの出会い • 昨年10月 • 「Rubyのプログラムが遅いよ∼」 • 「Scalaっていうのがあるよ」 • 6倍速に • 現在 Scala 歴1ヶ月 Thursday, January 17, 13
  • 4. Scalaでの例外処理 • No checked exception • サボりがちですが、 別に起きなくなったわけじゃありません • Blog記事(Error Handling in Scala)の内容を紹介 http://tersesystems.com/2012/12/27/error- handling-in-scala Thursday, January 17, 13
  • 5. try, catch, finally ~基本~ • Java と同じ • catch は PartialFunction で書く try { f() // throw new MyException() } catch { case e: MyException => ... } finally { ... } Thursday, January 17, 13
  • 6. Option ~NullPointerException からの卒業~ • 値が無いかもしれないことを型で表現 • Some(A) or None • Option の敵 → Some(null) Some(possiblyNull) ではなく Option(possiblyNull) • 使い方はコレクションっぽい。Cheat sheet 参照 • http://blog.tmorris.net/posts/scalaoption-cheat-sheet/ Thursday, January 17, 13
  • 7. Either ~エラー応答~ • Left[L] or Right[R] • Rightに成功応答、Leftにエラー応答 • ネストが深くなる傾向あり (Either[A,Either[B,...]]) def f(): Either[FailResult, String] = if (...) Right("abc") else Left(FailResult("failed")) f().fold( error => ..., success => ... ) Thursday, January 17, 13
  • 8. Try New in 2.10 From twitter.util ~Wrap Throwable~ • Failure[Throwable] or Success[T] • 例外を包む • スタックをまたげる → 非同期プログラミング object Try { def apply[T](r: => T): Try[T] = try Success(r) catch { case NonFatal(e) => Failure(e) } } Thursday, January 17, 13
  • 9. Try の使い方 import util.Try val sumTry = for { int1 <- Try(Integer.parseInt("1")) int2 <- Try(Integer.parseInt("2")) } yield { int1 + int2 } sumTry match { case Failure(e) => e.printStackTrace() case Success(v) => println(v) } Thursday, January 17, 13
  • 10. 失敗からのrecover • Failure[Throwable] を Success[T] へ var v: Try[Int] val r: Try[Int] = v.recover { case e: MyException => 100 } Thursday, January 17, 13
  • 11. まとめ • 基本は try, catch, finally • Option を使えば NullPointerException がなくなる • エラー応答を返したいときは Either • 例外を包む時はTry • Futureを使った非同期プログラミングのお供に Thursday, January 17, 13