例外をログに記録して続行するtry-catchブロックで、例外をスローするコードをラップしたいとします。ような何か:理想的には"this"をScalaの暗黙のパラメータとして渡すことは可能ですか?
loggingExceptions {
// something dangerous
}
は、私がもしあれば(そしてどれも、コンパイル時エラーを取得していない場合)、呼び出し元のオブジェクトに定義されたロガーを記録するために使用したいと思います。
def loggingExceptions[L <: { def logger: Logger }](work: => Unit)(implicit objectWithLogger: L): Unit = {
try {
work
} catch {
case t: Exception => objectWithLogger.logger.error(t.getMessage)
}
}
ここで、objectWithLoggerはクライアントコードで「魔法のように」展開されています。これ(または同様のもの)は可能ですか?
+1です。これはできますが、それはお勧めできません。ロギング特性とロギング特性を分離せず、「暗黙のマジック」を必要とし、不要なコンパイル時(暗黙の検索)と実行時(リフレクション)のオーバーヘッドを招きます。実装では、暗黙の変換が有効である必要があるという事実が隠されており、より現実的なコードベースでは、クライアントコードにimport文が必要になります。 –
あなたのネガのリストは「私はむしろ別の問題を解決したい」と要約しています。まあ、ええ、私たち全員ではありません。 – extempore
実際にはありません。基本的な問題は、ロガーを持つクラス内のコードブロックに例外を記録することです。この問題は、当初OPが意図していた方法(黙示的に)で解決することができます。あるいは、それをより簡単に特性で解決することができます。 –