例外処理 - Scala 2.9 の試みのユースケースは何ですか...一般化をキャッチ?




scala 例外処理 (2)

ユースケースは、アプリケーション全体で一般的なエラー処理を行うことができるようにすることです。 たとえば、管理者に電子メールを送信してアプリケーション内のすべての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ことができる有用なものの1つは、2つの部分関数のシーケンス演算子として機能する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意味(と名前)の正確なセマンティクスとさらにプレイすることができると思います。

https://code.i-harness.com

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

Scala 2.9最終リリースノート


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





scala