2011-04-30 19 views
4

我檢討我的代碼的最後一次搜索例外,當我停在這行代碼:Scala io.Source.FromFile是否會返回任何類型的異常?

var list: Array[String] = Source.fromFile(this.Path).getLines.toArray 

我搜索了斯卡拉琅的文件中,但似乎都不該行的方法拋出任何種類的ioException ... 這怎麼可能?

編輯:

try { 
    var list: Array[String] = Source.fromFile("").getLines.toArray 
} 
catch { 
    case ex:Exception => println(ex.getMessage) 
} 

沒有打印任何東西,爲什麼呢?

回答

3

檢查異常是由javac強制執行的,JVM並不真正瞭解它們。與Java相反,Scala並不關心已檢查的異常。

例如,看看Source你不會注意到任何代碼處理異常。某些在Java中不可能實現的功能,這需要使用try/catch s或throws子句。

儘管如此,一個Scala庫筆者仍可能希望確保Java的用戶檢查這些異常,於是就有了@throws註釋,它讓你聲明的方法可能會拋出一個異常就像throws Java的條款。請務必記住,@throws僅適用於Java消費。

您可能還想看看scala.util.control.Exception。它包含處理例外的各種好東西。

+1

我明白作者決定不使用檢查的異常,但至少他們應該在文檔中寫出可拋出的異常! – DDB 2011-05-01 10:38:18

+0

我也明白,在java中寫入throws子句中的每個異常都是可恨的,但我喜歡編譯器應該警告你的想法!事情是這樣的,沒有辦法在Scala中編寫好的代碼,因爲或者你忽略了異常並讓你的程序默默地崩潰,或者你把所有的代碼都封裝在try-catch中!這怎麼可能?! – DDB 2011-05-01 10:44:39

+0

@DDB,這當然是一個設計決定。我不認爲這一切都很糟糕。現在,爲了處理異常,我強烈建議您深入研究一下control.Exception,您會發現可以幫助您處理異常而不訴諸try/catch的實用程序。 – pedrofurla 2011-05-01 16:41:44

1

Source.fromFile調用java.io.FileInputStream.open,如果您給它一個不存在的文件,則會拋出FileNotFoundException

Source.fromFile不能捕捉到這個,所以它會在你的代碼中看到。

我懷疑在java.io軟件包中可能出現的其他許多異常都是類似的未處理,但顯然沒有記錄。

+0

因此,Scala文檔有不良的文檔......任何方式(傳遞一些參數給編譯器)知道我的方法拋出什麼異常? – DDB 2011-04-30 19:54:46

+0

不是我所知道的。我想到了這一點,只是這樣做,看到了例外。 – 2011-04-30 19:57:48

+0

現在我想知道有多少沒有記錄的異常可以拋出...... FileNotFoundException,ioException與權限有關的其他一些...在scala-lang應該花費更多的時間來改進它們比創建新代碼... – DDB 2011-04-30 20:32:15