2012-11-29 68 views
0

自2000年以來,我一直在處理PHP,但不是非常積極,而且我對PHP5的知識非常可怕。最近我經歷了長達5年的漫長休假後重新獲得了網絡開發的興趣,並開始了一個項目。我爲這個項目編寫了一個相當大的類,但到目前爲止沒有任何特定的錯誤處理。在類中處理錯誤,我應該使用什麼方法?

該類的目的是解析具有特定佈局的HTML文件並處理其數據,這對於我來說重新回到遊戲中或多或少是一種訓練練習。我現在開始重寫這個類,並且我決定是時候更加專業一些,而不是簡單地使用die(),而這一點迄今爲止我一直在使用。我想我們都可以同意這是一個可怕的方向。我希望這個類能獨立於項目,這樣我就可以將它分發給任何想使用它的人。

我想要解析的HTML文件包含具有特定邊框顏色的表格,具有特定bgcolors的trs,但元素數量是動態的。要驗證HTML文件居然有這種特定的模式,我有以下的樣本(僞)代碼

public function Validate() { 

    $tables = getall('table', $this->data); 

    foreach ($tables as $table) { 
     if ($table->bordercolor != 'navy' && $table->cellspacing != 0) { 
      // Error 
     } 

     foreach ($tables->tr as $tr) { 
      if ($tr->bgcolor != '#fff') { 
       // Error 
      } 
     } 
    } 
    return true; 
} 

凡說//錯誤,HTML佈局不檢查了,我的班不應嘗試解析它。傳統上,我會做這樣的:

if ($table->bgcolor != '#fff') { 
    $this->error = 'Invalid HTML layout'; 
    return false; 
} 

而且從我所說的方法,我會用

if ($class->Validate() === false) { 
    exit_with_error($class->GetError()); // Simple return of $this->error 
} 

我一直認爲這是一個不錯的方法,因爲它的簡單性。然而,這也是一個缺點,因爲除了文本本身之外,它並沒有提供有關錯誤的任何深入信息。我看不到錯誤被觸發的位置,被調用的方法等。

由於我恢復了我的PHP愛好,我發現了異常。我對他們的問題僅僅是我不明白如何正確使用它們。如果我應該使用它們。我希望我的課程具有便攜性。我可以使用異常來處理錯誤嗎?如果是的話,我該如何溝通錯誤(即翻譯我的傳統錯誤處理)?或者也許有更好的方法可以採取,我不知道。

任何幫助表示讚賞:)

回答

0

你肯定沿着正確的路徑思考。通常,我喜歡將錯誤處理邏輯與類設計分開。換句話說,我不希望在類中有一堆$this->error = 'something'邏輯,因爲爲什麼要爲每個類添加額外的代碼來存儲/處理/報告錯誤。

現在,您將遇到異常與錯誤以及何時使用每個錯誤。這可能是一個需要辯論的主題,但是我的個人偏好基本上是拋出異常,以避免您無法從代碼中恢復或無法處理的邏輯。我通常使用的一個很好的例子是,在任何需要某種類型或值的參數的類方法的開始處引發Exceptions。像這樣的例子:

public method set_attribute($value) { 
    if (empty($value)) { 
     throw new Exception('You must send me something'); 
    } else if (!is_string($value)) { 
     throw new Exception("You sent me something but it wasn't the string I was expecting."); 
    } 
    // method logic here 
} 

這裏如果主叫方沒有給我們一個非空字符串,我們拋出一個異常,因爲我們沒有想到這一點,我們不能保證該方法成功完成無適當的價值。根本沒有理由繼續使用該方法。我們向主叫方發送有關該問題的消息。希望他們在try-catch塊中調用這個方法,並且可以優雅地處理這個異常並將它傳遞給調用堆棧。如果不是這樣,你的代碼就會停止執行,並從未捕獲的異常中發出致命錯誤(在測試中很容易發現)。

觸發錯誤,我老實說使用少了很多,通常更多地用於調試,警告的目的。這方面的一個例子可能是已過時的方法,你仍然要工作,但你想給用戶一個錯誤的

public function old_method() { 
    trigger_error('This method had been deprecated. You should consider not using it anymore.'. E_USER_WARNING); 
    // method logic 
} 

當然你也可以觸發E_USER級警告的任何級別這裏自己。

就像我說的,我傾向於使用Exceptions來處理更多事情,因爲它們也可以輕鬆擴展以方便使用日誌記錄等。我幾乎總是會有一個自定義的Exception類繼承自PHP的基類Exception類,它也提供日誌記錄等。

另一件要考慮的事情是全局錯誤處理和Exceptoin處理。我強烈建議使用這些,這些都是任何新項目中的第一行代碼。同樣,它會讓你更好地控制你記錄錯誤/異常的方式,而不是默認情況下的方式。

+0

深度反應良好。我已經讀過,當意外情況發生時,異常應該「只能」拋出,但當我知道這些意想不到的事情時,我從來沒有真正清楚過。但是你的$ value例子是有道理的,正如在這種情況下預期的那樣。但我仍然不確定使用哪種方法,說實話。對於我想讓網站獨立的課程,你會推薦哪條路線?我看到拋出Exceptions的唯一問題是,任何使用該類的人都必須將所有內容放在try-catch塊中,我懷疑這些塊不是非常用戶友好的。或者我錯了? –

+0

@ M.A。我實際上會使用例外。任何使用你的類的人都可能會在實現之前查看代碼,並意識到拋出了異常。即使他們不這樣做,他們也會將意想不到的數據傳遞給你的班級,例如,他們的程序執行將會停止,並且能夠很快地發現問題所在。此外,如果您使用該類分發使用示例,則可以輕鬆顯示try-catch塊的使用。 –

+0

另一方面,如果您觸發用戶錯誤,那麼他們可能不容易被沒有開發錯誤報告功能的開發人員或正在查看其日誌以查找錯誤的開發人員輕鬆捕獲。 –

0

我不知道你是如何做的問題,但如果你想潛入例外,學習如何使用try/catch語句。通常它會是這樣的:

try { 
    //some code that may cause an error here 
} catch (Exception e) { 
    //if a error is found, or an exception is thrown in the try statement, whatever here will execute 
    //you can get the error message by using e->getMessage() 
} 

你可以閱讀更多關於它在這裏:http://php.net/manual/en/language.exceptions.php

+0

據我所知,我的方法不提供大量的調試選項,除非PHP有一個功能,我已經錯過了。它是一個單獨的課程,所以不需要非常花哨的東西。我的傳統方法是一種很好的「常規」報告錯誤的方法嗎?我遇到的最大的問題是,如果除了我以外的其他人使用我的課程,他們看起來不太友好。 –

相關問題