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

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 

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

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 

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 (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

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

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