6

初めての Scala プログラムとして、XML ファイルをあるスキーマから別のスキーマに変換する小さなユーティリティを作成しようとしています。

ファイルの内容を取得するメソッドの作成を開始しました。

  def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
    try
    {
      val source = scala.io.Source.fromFile(filename, encoding)
      val contents = source.mkString
      source.close()
      return Some(contents)
    }
    catch 
    {
      return None
    }

  }

しかし、それはコンパイルされません。行からエラーメッセージとして「value apply is not a member of Nothing」と「value isDefinedAt is not a member of Nothing」が返ってきますreturn None

Option を返す例はすべて一致を使用していますが、ここでは意味がありません。なんらかの理由でファイルを読み取れなくても失敗しないようにしたいだけです。

この場合、どうすればよいですか?Scalaでこの種のことを行うためのパターンはありますか?

4

3 に答える 3

5

についてのすべてがあります"catch"

scala では、コンパイルするには次のようにする必要があります。

  def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
    try {
      val source = scala.io.Source.fromFile(filename, encoding)
      val contents = source.mkString
      source.close()
      Some(contents)
    } catch {
      case x: IOException =>  None
      case x => errorHandler(x) // if any other exception
    }
  }

  def errorHandler(e: Any) = None // put some logic here..

だから使用:

catch { case: x:ExceptionType ={ .. handling .. }}

Scalacatchでは、別の関数を引数として受け入れる関数です。したがって、あなたが持っているものを持っていると、適用機能について不平を言うでしょう。case欲しい機能(PartialFunction)を提供しますcatch。(一言で言えば)

注:すべての例外はunchecked偶数ScalaですIOException

于 2013-10-30T18:12:57.067 に答える
0

これを試して:

 def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
try
{
  val source = scala.io.Source.fromFile(filename, encoding)
  val contents = source.mkString
  source.close()
  return Some(contents)
}
catch
  {
    case e:Exception=>{
      return None
    }

  }

}

于 2013-10-30T18:13:33.973 に答える