2013-10-30 37 views
5

İlk Scala programımda, bir XML dosyasını bir şemadan diğerine dönüştürecek küçük bir yardımcı program yazmayı deniyorum. Scala'da nasıl iade edilir

Bana dosya içeriğini verecek bir yöntem yazmaya başladı:

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 
    } 

    } 

Ama derleme değil. return None hattından hata mesajları olarak "değer uygulamam Nothing öğesinin bir üyesi değil" ve "value isDefinedAt öğesinin bir üyesi değil" yanıtını alıyorum.

Bir Seçenek döndürmeyi bulduğum tüm örnekler eşleştirmeyi kullanıyor, ancak bu burada bir anlam ifade etmiyor. Dosyayı bir nedenle okuyamazsam başarısız olmamayı istiyorum.

Bu durumda ne yapmalıyım? Scala'da böyle bir şey yapmak için bir model var mı?

cevap

5

"catch" hakkında her şey vardır. scala olarak

onu derlemek yapmak için böyle olması gerekiyordu:

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.. 

Yani kullanın: Scala catch yılında

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

argüman olarak başka bir işlevi kabul eden bir fonksiyondur. Yani, sahip olduğunuz şeylere başvurma işlevi hakkında şikayette bulunabilirsiniz. case, catch'un istediği işlevi (Kısmi İşlev) sağlar.

Not (Özetle cinsinden): Tüm istisnalar unchecked yılında Scala bile IOException bulunmaktadır.

+0

Ama stil hakkında + Nicolas Rinaudo ile katılıyorum - arayan ne olursa olsun, hata ile nasıl başa çıkmak için karar verir.Ancak, bazen, arayan tarafa hata göndermeden önce, arama tarafında bazı şeyler (önbelleği temizleme veya temizlemek için ne gibi) işlemek gerekir. – ses

0

bu deneyin:

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 
    } 

    } 

} bu özel durum (istisna işleme) olarak

8

, bunun yerine bir Try kullanmanızı öneririz.

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) 
    }.toOption 
} 

Bununla birlikte, özel durumun yakalanmasını öneriyorum. None döndürerek hatanın nedenini yutuyorsunuz: FileNotFoundException mu? standart bir IOException mu? hata ile bir mesaj oldu (Unsupported encoding akla geliyor ...)?

Başparmak kuralım, arayanın istisnalarla ilgilenmesine izin vermektir. Try gerekli tüm yöntemleri vardır çünkü, bu oldukça düzgün bir şekilde for-anlama kullanılabilir,

Try {loadFile("test.txt")}.toOption 

Daha iyisi: o hata kendisi hakkında umursamzsa, şeyleri öğrenmek kadar kolaydır Bu sonuçlanacaktır

for(s <- Try {loadFile("test.txt")}; 
    i <- Try {s.toInt}) yield i 

ya bir Success[Int] veya yanlış gittiğini tam olarak ne açıklayan bir istisna içeren bir Failure.

İlgili konular