2010-06-07 63 views
2

這只是一個效率問題真的..我很想知道是否有更高效或邏輯的方式,人們用來處理這種情況。功能鏈接取決於布爾結果

在我的asp.net應用程序我運行一個腳本來生成一個新的項目我在最高級別的代碼如下所示:

Dim ok As Boolean = True 
    ok = createFolderStructure() 
    If ok Then ok = createMDB() 
    If ok Then ok = createProjectConfig() 
    If ok Then ok = updateCompanyConfig() 

我創建了一個布爾值和每個函數返回一個布爾結果,下一個鏈中的功能只有在前一個功能成功時纔會運行。我這樣做是因爲一個asp.net應用程序將繼續運行整個頁面生命週期,除非有一個未處理的異常,並且我不希望我的整個應用程序被搞砸,如果鏈中出現問題(有很多在這個例子中複製和刪除文件等)。

我只是想知道其他人如何處理這種情況? vb.net單行if語句相當簡潔,但我想知道是否有更好的方法?

回答

2

正常情況下,函數不應該返回true/false根據其結果 - 這被認爲是老式的。 try/catch塊在這裏更好,在出現錯誤的情況下,該函數會引發異常。那是當然的,假設的錯誤只發生在特殊的場合:

Try 
    createFolderStructure() 
    createMDB() 
    createProjectConfig() 
    updateCompanyConfig() 
    ''// ... 
Catch ioExeption as IOException 
    ''// handle it 
End Try 
+0

感謝您的答覆..與try catch方法的問題是,所有的功能仍然會運行,採取上面的例子,如果createFolderStructure()失敗,然後createMDB()不能工作,上述不會停止。 如果try/catch在每個函數本身中,那麼即使我在catch中調用'Exit Function',鏈中的下一個函數也會運行? 下一個函數仍然需要查詢結果以確定它是否安全運行? – Markive 2010-06-07 09:25:42

+2

@Markive,你有一些事情混在一起。如果createFolderStructure引發異常,那麼createMDB最不會運行。 – 2010-06-07 09:27:29

+0

@Markive - 如果'createFolderStructure'失敗並引發異常,則不會調用以下任何方法。控件將立即傳遞給異常處理部分。 – ChrisF 2010-06-07 09:27:42

2

您可以刪除布爾一起

If createFolderStructure() Then 
If createMDB() Then 
If createProjectConfig() Then 
If updateCompanyConfig() 

,但我不得不承認,使用異常是更好的方式來處理這些的情況。

+0

您也可以查看'AndAlso'運算符,它與其他語言中的&&'類似運行,它將逐個觸發函數,直到返回False。 – Kobi 2010-06-07 09:31:01

1

Kobi向你展示瞭如何做到這一點。如果您確實需要使用布爾函數的結果,那麼您可以使用和其他運算符將它們鏈接起來。

Dim ok As Boolean 
ok = createFolderStructure() 
    AndAlso createMDB() 
    AndAlso createProjectConfig() 
    AndAlso updateCompanyConfig() 

這些表達式是懶惰的評估,即如果一個函數返回false,則表達式的其餘部分不被評估。

+0

也是And的短路版本。 – dbasnett 2010-06-08 11:40:30