2011-10-10 194 views
1

這是一個通用的編程問題,不涉及任何特定的語言。返回值與返回錯誤代碼?

一個新的程序員通常會寫,計算某個值的方法,然後返回值:

public Integer doSomething() 
{ 
    // Calculate something 
    return something; 
} 

public void main() 
{ 
    Integer myValue = doSomething(); 
} 

但當something計算過程中發生異常,什麼是處理異常的最佳方式特別是在提供用戶反饋時?如果您嘗試計算something,並且發現異常,您會返回什麼結果?沒有什麼計算,所以你返回null?一旦你返回它(不管它是什麼),你是否需要在父方法中做另一個try/catch來檢查是否返回了有效值?如果沒有,那麼確保用戶得到一些反饋?

我已經聽到關於永遠不會返回值的表的參數,而是將計算值設置爲指針或全局變量,而是僅從方法返回錯誤代碼,然後(在父方法中)僅處理相應的錯誤代碼。

是否有最佳做法或方法呢?有沒有什麼好的資源可以讓我們更好地瞭解處理這個問題的最佳方法?

更新澄清

考慮下面的代碼:

public void main() 
{ 
    int myValue = getMyValue(); 

    MyUIObject whatever = new MyUIObject(); 
    whatever.displayValue(myValue); // Display the value in the UI or something 
} 

public Integer getMyValue() 
{ 
    try 
    { 
    // Calculate some value 
    } catch (exception e) { 
    // ?? 
    } 
    return value; 
} 

我調用該方法得到一些int值,然後我回去。回到main(),我做了一些有價值的事情,比如在本例中的Log中顯示它。通常我會在用戶界面中顯示該值。

不管怎麼說,如果在getMyValue()中發現異常,value也會返回,但它是空的?那麼main()會發生什麼呢?我是否還必須測試main()中的有效值?

我需要程序來相應地處理錯誤並繼續。下面的人建議在getMyValue()方法中在UI中顯示適當的信息。我看到兩個潛在的問題:

  1. 看來我將混合業務邏輯與(在這種情況下)用戶界面的邏輯。
  2. 我將不得不將MyUIObject的引用傳遞給getMyValue(),或者我可以從函數內部訪問它。在上面這個簡單的例子中,沒有什麼大不了的,但是如果有一組UI元素需要更新或者根據getMyValue()發生的變化進行更改,傳遞它們都可能有點多...

我讀過一堆關於所有這些基本原理的文章,但似乎無法找到上述情況的直接答案。我感謝任何幫助或見解。

+0

這是什麼語言?然後,我們可以給你更具體的參考。 – jwd

+0

你可以假裝它是Java。 –

回答

2

我覺得你不太理解異常。

如果拋出一個異常,你就無法正常功能回報:

public Integer doSomething() 
{ 
    throw new my_exception(); 
    // The following code does NOT get run 
    return something; 
} 

public void main() 
{ 
    Integer myValue = doSomething(); 
} 

例外的主要優點是:

  • 你可以寫你的代碼,彷彿一切都是成功,這通常更清晰
  • 例外情況很難忽視。如果異常未處理,通常會出現一個明顯的大聲錯誤,並帶有堆棧跟蹤。這與錯誤代碼形成對比,其中更容易忽略錯誤處理。

我推薦this post by Eric Lippert,它討論了異常以及它是什麼時候並且不適合處理它們。


UPDATE(響應評論):

您可以完全處理異常,並繼續,您可以通過捕捉異常做到這一點。

如:

try 
{ 
    // Perform calculation 
} 
catch (ExceptionType ex) 
{ 
    // A problem of type 'ExceptionType' occurred - you can do whatever you 
    // want here. 
    // You could log it to a list, which will be later shown to the user, 
    // you could set a flag to pop up a dialog box later, etc 
} 

// The code here will still get run even if ExceptionType was thrown inside 
// the try {} block, because we caught and handled that exception. 

關於這樣做的好處是,你知道什麼樣的東西出了問題(從異常類型),以及信息(通過尋找到ex的信息),所以你希望得到你需要的信息來做正確的事情。


更新2響應您的編輯:

你應該在你可以在你所希望的方式來響應,其中層處理異常。對於你的例子,你是對的,你不應該捕捉到代碼中很深的異常,因爲你無法訪問UI等,因此你不能真正做任何有用的事情。

有關此版本的您的示例代碼如何:

public void main() 
{ 
    int myValue = -1; // some default value 
    String error = null; // or however you do it in Java (: 

    try 
    { 
    getMyValue(); 
    } 
    catch (exception e) 
    { 
    error = "Error calculating value. Check your input or something."; 
    } 

    if (error != null) 
    { 
    // Display the error message to the user, or maybe add it to a list of many 
    // errors to be displayed later, etc. 
    // Note: if we are just adding to a list, we could do that in the catch(). 
    } 

    // Run this code regardless of error - will display default value 
    // if there was error. 
    // Alternatively, we could wrap this in an 'else' if we don't want to 
    // display anything in the case of an error. 
    MyUIObject whatever = new MyUIObject(); 
    whatever.displayValue(myValue); // Display the value in the UI or something 
} 

public Integer getMyValue() 
{ 
    // Calculate some value, don't worry about exceptions since we can't 
    // do anything useful at this level. 
    return value; 
} 
+0

如果我需要程序繼續正常工作,但可能顯示某個值未正確計算,會發生什麼情況?例如,假設我有一個具有5個不同的計算值並顯示的值。如果在計算其中一個值時出現異常,我想以某種方式通知UI中的用戶,但我希望該程序繼續工作,並仍然按照預期計算其他值。我不希望我的程序停止工作......我該如何處理這個問題? –

+0

@Jakobud:我更新了我的回答以解答您的評論 - 這有幫助嗎? – jwd

+0

已爲您更新的問題。 –

0

您寫道:

我聽到的論點在桌子上的左右兩邊從來沒有返回值可言,而是設置計算值作爲指針或全局變量,而是僅從方法返回錯誤代碼,然後(在父方法中)相應地處理錯誤代碼。

[編輯] 其實,EXCETION可以被看作是錯誤的代碼,這與相關消息一起來臨,你作爲程序員應該知道你的異常必須被捕獲,處理並最終顯示到用戶。只要讓異常傳播(在被調用的函數堆棧中向下),就不會使用返回值,因此您不必關心處理相關的遺漏值。良好的異常處理是一個相當棘手的問題。

由於jwd回答,我沒有看到在一個方法中引發異常,然後在同一個方法中處理excation以僅返回一個錯誤值。澄清:

public Integer doSomething(){ 

    try{ 

     throw new my_exception();} 

    catch{ return err_value;} 

    } 

是毫無意義的。

+0

你說使用全局變量和指針而不使用異常是最佳做法嗎?這很瘋狂!還是僅僅是我誤解了你寫的內容? –

+0

我實際上是在用Java思考,在那裏例外被視爲錯誤...我應該編輯我的帖子:p – ThanksForAllTheFish

+0

如果你說'error'並且想到'exception',很難理解你的意思。 ;-) btw。 Java是一個非常好的例子,爲什麼異常要比返回錯誤代碼好得多。它使代碼更安全。 –

0

異常是面嚮對象語言(OOL)的一種屬性。如果你使用OOL,你應該更喜歡異常。它比返回錯誤代碼好得多。您可以找到很好的例子,說明錯誤代碼方法如何生成比基於異常的代碼長得多的源代碼。例如,如果您想要讀取文件並對其執行某些操作並保存爲其他格式。你可以在沒有異常的情況下用C語言來完成,但是你的代碼將充滿if(error)...語句,也許你會嘗試使用一些goto語句,也許一些宏使得它更短。但也絕對不透明,很難理解。你也可以經常忘記測試返回值,以免看到錯誤和程序繼續。這不好。另一方面,如果您使用OOL編寫並使用異常,則源代碼將着重於「沒有錯誤時應該怎麼做」以及錯誤處理位於不同的位置。只需一個錯誤處理代碼就可以解決許多可能的文件錯誤源代碼更短,更清晰等。

我個人絕不會嘗試返回面嚮對象語言中的錯誤代碼。一個例外是C++,其中異常系統有一些限制。