2015-11-09 70 views
2

我正在寫一些關於在SML中讀取和寫入文件的簡單程序,並且我正在考慮跟蹤文件是否成功打開/溢出發生等。如果在編譯期間發生任何異常,我希望函數返回假的還是真的。SML:如何檢查是否有異常?

這樣的實現是可行的嗎?如果是這樣,怎麼樣?如果沒有,還有其他解決方案嗎


我不知道如果我做正確:

fun getN(file) = 
let 
    val input = TextIO.openIn file 
    fun num(n) = 
     case n of 
      NONE => [] 
      | SOME(str) => str_to_num(str) @ num(TextIO.inputLine input) 
in 
    if OS.FileSys.access(file, []) then 
     num(TextIO.inputLine input) before TextIO.closeIn input 
    else [] 
//OR 
    num(TextIO.inputLine input) before TextIO.closeIn input 
    handle Io => [] 
end; 

然而,這些方法都不會返回[]當文件的目錄不存在。爲什麼?

+1

「如果在編譯過程中出現任何異常」您是指在運行時?看看'handle'語句。 –

回答

1

是的,這是可行的:

fun wasExceptionRaised f x = (f x; false) handle e => true 

這將執行f x,丟棄的結果,並返回false,如果有異常升高,在這種情況下例外,e,被處理,丟棄true是回。雖然你可能要處理特定的異常,而不是別人,例如當測試:

val test_should_not_find_file = 
    (TextIO.openIn "non-existing-file"; false) 
    handle Io { cause = SysErr ("No such file or directory", _), ... } => true 
     | _ => false 

如果你只是記錄如果有異常被拋出,你可以做同樣的事情:

structure YourLogger = 
struct 
    fun logException e = 
     let val time = Date.toString (Date.fromTimeLocal (Time.now())) 
      val msg = "On "^time^" an error occurred: " 
        ^General.exnName e^".\n" 
        ^General.exnMessage e 
     in appendFile "myLog.txt" msg end 

    fun logged f x = f x handle e => (logException e; raise e) 
end 

現在,而不是致電f x,您可以撥打logged f x以獲得相同的結果,但在記錄任何例外的情況下。