2012-02-23 67 views
1

我正在使用log4net嘗試使用表達式,它不起作用。我認爲缺少一些東西,但我不知道是什麼。 這裏是我的代碼:log4net和「with try」F#

let clusterIDArray = try 
         myfunction 
        with 
         log.Fatal("my function is not working") 


log.Debug("my function is working") 

任何想法?

+2

你沒有捕捉異常。我認爲'嘗試與_ - > log.Fatal(「我的功能不工作」)功能將工作。 – pad 2012-02-23 17:05:20

+1

謝謝你,你是完全正確的。此外,我發現了一些http://stackoverflow.com/questions/4972436/f-try-with-unhandled-exceptions。對不起,幾乎重複的問題。 – fabco63 2012-02-23 17:08:23

回答

4

有在您的代碼段兩個錯誤:

  • 你沒有執行你的函數。我想你確實在你的真實代碼中執行了它;這是制定一個例子的問題。
  • 您沒有發現異常,或者您的try...with...塊在語法上不正確。

假設我們捕捉異常,並返回在任何情況下一個數組,記錄的更地道的方式可以是:

let clusterIDArray = 
    try 
     let result = myfunction args // Assume args are arguments declared before 
     log.Debug("my function is working") 
     result 
    with 
    | ex -> 
     // ex is of type exception which can be parsed by log4net 
     log.Fatal("my function is not working: ", ex) 
     [||] 
+0

謝謝你。這裏的一個問題是作爲一個Array類型的結果,而log.Fatal作爲一個類型單元,當我編寫它時似乎是一個問題。我想在發生異常時停止執行代碼,但我不知道如何在異常情況下返回數組類型。 – fabco63 2012-02-23 17:46:43

+0

只需在'log.Fatal'後面的行中返回一個空數組['||]'。我建議您將異常的堆棧跟蹤包含到日誌中,以便知道導致問題的原因。 – pad 2012-02-23 17:50:12

+0

我建議使用'log.Fatal(「not working」,ex)'。如果需要,Log4net可以解析異常並打印堆棧跟蹤。 – 2012-02-24 16:11:47

3

很難說不知道myfunction是什麼,但是就像你寫的那樣,代碼實際上並沒有運行這個函數。它只是將其作爲值(來自try .. with塊)返回並將其分配給clusterIDArray值,因此代碼將永遠不會丟失。

如果該功能只需一個unit的說法,你可以把它叫做try .. with塊像這裏面(如果它需要一些參數,你需要給他們的塊內的功能):

let clusterIDarray = 
    try 
    myfunction() 
    with _ -> 
    log.Fatal("not working") 
    reraise() // You still need to return something here or rethrow the exception 

log.Debug("my function is working") 

編輯正如其他人所指出的,語法with e無效。如果您要忽略該異常,則需要編寫with e ->with _ ->

+0

謝謝托馬斯。事實上我不是很清楚,我的函數接受一個字符串作爲參數並返回一個數組(clusterViewName |> readDSLClusterID)。那麼我是否需要在「with」部分中返回相同類型(即數組)?我在嘗試像let clusterIDArray = try clusterViewName |> readDSLClusterID with | :?例外 - > log.Fatal(「ClustersID not downloaded」) – fabco63 2012-02-23 17:27:19

+0

是的,你必須返回一個空數組(即使用'[| |]'),或者你需要調用'reraise()'來重新拋出異常而不返回。 – 2012-02-23 17:52:14

+0

再次感謝托馬斯和帕德你的答案,它的工作,現在對我來說很清楚。 – fabco63 2012-02-23 18:00:45