2011-10-17 16 views
19

私はScala 2.9 try ... catchフィーチャーを読んで実験しました。それは可能性を考えています。数行のコードを保存する以外に実際に私は何を使用しますか?Scala 2.9のtry ... catch一般化のユースケースは何ですか?

Scala 2.9 Final Release Notes

+0

私はそれを使用するかどうかはわかりませんが、* any *(適合)PartialFunction ...他の場所で統一されたエラー処理を使用できますか? ( 'ignoreTheseSillyClosableExceptions'を言う。)また、Scalaはインスピレーションのためにその;-) –

+0

のようにそれを表現できること「それだけでクールだ」:彼はこれを実装したときにポール・フィリップスは、動機付けの例を提供する:http://www.scala-lang.org/node/8070 –

+3

質問は、例または少なくともリンクを使ったほうがよいでしょう。 – ziggystar

答えて

24

ユースケースは、アプリケーション全体の一般的なエラーハンドリングを持ってできるようにすることです。たとえば、管理者に電子メールを送信してアプリケーション内のFileNotFoundExceptionをすべて処理したいとします。以前は、このようにそれを行う必要があるだろう:

// Globally 
val fileNotFound: PartialFunction[Throwable, Unit] = { 
    case e: FileNotFoundException => 
    // Create report and send the e-mail 
} 

// On each try-catch-block 
try { 
    // Open file 
} 
catch { 
    case fnf: FileNotFoundException => fileNotFound(fnf) 
} 

今、あなただけの操作を行います。

try { 
    // Open file 
} catch fileNotFound 

また、これはあなたがorElseメソッドを使用してそのようないくつかの例外ハンドラをリンクすることができます素敵な利点を持っています

val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat 

そして、ファイル例外処理が必要な場所であればどこでも使用できます。このようなエラーハンドラは、例えば、アプリケーションの構成ファイルに基づいて動的に組み合わせることができる。これはどこでもパターンマッチングと正しいハンドラを呼び出すよりもはるかに面倒ではありません。部分関数の上に魅惑することができ

一つの有用な事は二つの部分の機能上のシーケンシング事業者として働きandAlso演算子、です。これは、一般的なエラー処理を行った後に、特定のtry-catchブロックに固有のエラー処理を行う場合に便利です。

implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new { 
    def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] { 
    def apply(t: Throwable) = { 
     if (pf.isDefinedAt(t)) pf(t) 
     localpf(t) 
    } 
    def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t) 
    } 
} 

そして、あなたがこれを行うことができます。

scala> try { 
    | throw new java.io.FileNotFoundException 
    | } catch fnf andAlso { 
    | case e: Exception => println("I don't know, but something is specific to this particular block.") 
    | } 
I don't know, but something is specific to this particular block. 

は、私はあなたがandAlsoの正確な意味と意味(と名前)でさらにプレイできると思います。

+0

ニースの答え - 私はまた私も欠けていた部分だったと思います。 – Seth

7
axel22によって

良い答えが、私はその導入のための本当の理由は何か他のものだと思います。 try/catch/finally取り扱いは特殊なケースを導入しました。部分的な関数リテラルを使用しましたが、実際に部分的なリテラルに置き換えることはできませんでした。さて、catchはちょうど部分的な機能を受け取り、その言語のもう1つの特別なケースはなくなりました。

+0

私もこの答えが好きです:) – Seth

+0

これは実際に私の最初の推論を確認します - これは主に "整頓"機能です。 – Seth

+0

合意 - ベストプラクティスの統一原則 - 結果としてユーザビリティを持つ一般化されたコンストラクトです。 – axel22

関連する問題