2016-07-11 14 views
0

今、次のコードで漫画本のファイル(.cbr &cbz)を開いていますが、もっとうまくいくと思います。それについてどうやって行きますか?Scalaを使って漫画を読む

@throws(classOf[Exception]) 
def extract(filePath: String): File = { 
    val unZip = new runCommand(Seq("7z", "x", "-y", filePath, s"-o${tempLocation}")) 
    if (unZip.exitValue == 0){ 
     new File(tempLocation) 
    }else{ 
     throw new Exception(unZip.errValue) 
    } 
} 
@throws(classOf[Exception]) 
def preExtract(filePath: String): File = { 
    try { 
     filePath.split("\\.").last match { 
      case "cbz" => extract(filePath) 
      case "cbr" => extract(filePath) 
      case _ => 
       throw new FileNotFoundException("Incorrect file extension for file: " + filePath) 
     } 
    } catch { 
     case ex: Exception => 
      throw ex 
    } 
} 

答えて

0

私はあなたがscala.util.Tryを使用しての代わりに、例外をキャッチして再スローにルックアップするためにお勧めします。 Hereは、このトピックに関する素晴らしい記事です。

ここでは、使用しているrunCommand()機能に慣れていません。おそらく自分のものですか?その場合、エラーが発生しなければ、OptionまたはNoneにラップされたエラーコードを返すように変更することができます。もしそうなら、あなたのスニペットは2個のネストされたmatchブロックを持つ単一の機能として実装することができます。

def extract(filePath: String): Try[File] = filePath match { 
    case str if str.endsWith(".cbz") || str.endsWith(".cbr") => 
    runCommand(Seq(...)) match { 
     case None => new File(tempLocation) 
     case Some(errValue) => throw new UnzipFailedException(errValue) 
    } 
    case _ => throw new InvalidArgumentException(s"Incorrect file extension for file: $filePath") 
} 

私はこのコードをテストしていないが、多分それはいくつかの助けのです。

+0

私は現在コンピュータから離れており、これが動作するかどうかはテストできません。なぜ私はあなたがif文の代わりにパターンマッチングを使用しているのが不思議ですか? – Jones

+0

意味的に違いはありませんが、それは主に好みの問題だと思います。単純なケースでは、その差は無視できるものですが、一般的には、特に多型チェックやデコンストラクタを使用するときに、「一致」がより明確でより簡潔なコードになります。上記のコードを 'if'式で書き換えて、あなたが好きなバージョンを見ることができます。 – hezamu

関連する問題