2

私のアプリケーションは、ファイルからいくつかの構成値を読み取ります。プロセスでエラーが発生した場合は、それらの構成パラメーターのデフォルト値を設定したいと考えています。私がやっていることは次のとおりです。

val (param1, param2) = {
  try{
    val props = new java.util.Properties
    props.load(getClass.getResource("/myapp.properties").openStream)
    (
      props.getProperty("param1", "default1"),
      props.getProperty("param2", "default2")
    )
  }
  catch{
    case _ => ("default1", "default2")
  }
}

例外が発生すると、catch ブロックで行っていることが期待どおりに機能しないことを知っています。それを修正する方法はありますか?私はScala 2.9を使用しています

4

1 に答える 1

4

これは機能しますが、実行時エラーが発生する可能性があります。

val (a,b) = whatever

whateverがのスーパータイプである限り呼び出すTuple2ことができます -- 特に、それはAnyRefまたはAnyである可能性があります。これは実際に、型が十分に一致しない場合に try/catch の戻り値が拡張されるものです。タイプの属性を追加することで、それが正しいタイプであることを確認できます。

val (a,b): (A, B) = whatever

そして、型チェッカーは、try/catch を通じて右側が正しい型でない場合に文句を言います。

例えば:

val (a,b): (String, String) = try {
  ("perch", if (scala.util.Random.nextBoolean) throw new Exception else "halibut")
} catch {
  case e: Exception => ("salmon", "herring")
}

コンパイル時エラーが発生した, "cod"後に追加しようとすると。"herring"この割り当てを繰り返し入力すると、a=パーチと b=オヒョウが半分ずつ、a=サーモンと b=ニシンが残りの半分になります。


補遺: 2.9 (またはそれ以下、私は確認していませんが、推測します) では、次のように、try/catch ステートメントに型の割り当てを設定する必要があります。

val (a,b) = (try {
  ("perch", if (scala.util.Random.nextBoolean) throw new Exception else "halibut")
} catch {
  case e: Exception => ("salmon", "herring")
}): (String, String)

キャッチの型チェックを取得します。

于 2013-02-28T12:31:27.010 に答える