2013-03-07 15 views
2

因此,我第一次開始一些PHP開發。我正在嘗試使用HTML DOM導航/解析庫。我選了加農,但並不關心我最終使用哪一個。PHP錯誤處理,當錯誤是文本消息而不是拋出異常

但我已經注意到了,PHP與我所見過的所有其他編碼語言有着根本的不同。當我看錯誤處理時,這是非常明顯的。如果一個包含的類/腳本只是輸出它的錯誤,我不能簡單地用try/catch來捕獲它。我相信這是發生在這裏的事情。我沒有控制權,儘管我是告訴file_get_dom運行的人。它可以做任何想要的事情,並將它想要的任何東西寫入生成的HTML文件。

這是不好的做法,它肯定是讓我困擾。解決辦法是什麼?我可以捕捉它嘗試寫入的文本(用隱藏的div來包圍它)嗎?但是,與此同時,我想阻止這個班寫任何想要的東西,我也要知道是否發生了錯誤,以便我可以採取適當的步驟。

注意:做更多的測試,即使當我拋出我自己的錯誤或使用「或死」時,它並沒有按照我所期望的完成。所以,也許我也不知道如何使用Try/Catch,儘管我已經在幾個教程中看到了它的使用。但我的原始問題仍然存在,即使這是一個語法錯誤,如何控制包含的類,以便他們不污染我的HTML文件。

<?php 
try{ 
include_once('ganon.php'); 
}catch(Exception $e){ echo "OUT: $e->getMessage()"; } 

class GamesSummery{ 
    public function __construct(){ 

    try{ 
     $html = file_get_dom('web site adress'); 
    }catch(Exception $e){ echo "Main: $e->getMessage()"; } 
    } 
} $test = new GamesSummery(); 

輸出(S):

"Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\hockey\ganon.php on line 238"

OR

"Warning: file_get_contents(): Filename cannot be empty in C:\xampp\htdocs\hockey\ganon.php on line 19"

回答

1

對於第一種:在PHP有致命的錯誤,好像這不能被逮住語法錯誤(及其他)。在這種情況下,程序將立即終止。


對於所有其他有一種方法使用set_error_handler()

我已經爲您準備了一個自定義錯誤處理函數,用於將所有錯誤或警告轉換爲異常。請注意,函數的輸出(我註冊的方式)取決於php.ini設置error_reporting

先註冊錯誤處理程序:

set_error_handler('errorHandler', ini_get('error_reporting')); 

這裏談到的函數本身:

function errorHandler(
      $errno, 
      $errstr, 
      $errfile = null, 
      $errline = null, 
      $errcontext = null 
) { 
    $message = sprintf("%s: %s, file: %s, line: %s", 
     $errno, $errstr, $errfile, $errline 
    ); 
    // --> 
    throw new ErrorException($message, 0, $errno, $errfile, $errline); 
} 

您可以嘗試的代碼與下面的例子:

try { 
    $a = 1/0; // will throw a warning 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

哦,所以PHP中有很多不同類型的錯誤,其中大多數不是Exceptions。 但還有其他人根本無法抓到?這是否算「致命錯誤」?因爲,那很煩人。從我的角度來看,我真的不在乎在某些被稱爲庫的情況下發生了什麼,在這種情況下以及許多其他情況下,即使解析失敗,我也可以繼續正常執行。但是,如果我無法捕捉到錯誤,則不是。 – Jonathon 2013-03-08 00:52:56

+0

我看到他們是另一種類似的方法來捕捉他們。 我不知道我是否可以使用相同的函數來捕獲兩者。 – Jonathon 2013-03-08 00:58:39

+0

我不明白最後的評論。關於致命錯誤,如果第三方庫觸發了致命錯誤,那麼確實存在問題。這就像C中的一個段錯誤。 – hek2mgl 2013-03-08 00:59:16

2

首先,增加你的php.ini的執行時間,參數或者set_time_limit:http://php.net/manual/en/function.set-time-limit.php

其次,你的文件名,你被創建爲空,所以你需要檢查或放置一個新的文件名:

您需要創建一個文件名或寫入一個新的文件名才能訪問它。創建一個文件爲例:

$ourFileName = "example";

$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");

fclose($ourFileHandle);

2
  • 將(可捕獲)錯誤轉換爲例外:創建一個函數,該函數使用使用set_error_handler()
  • 防止錯誤編碼器的輸出:使用ob_start() & ob_end_clean(),但更重要的是,試着找出編碼器的位置和位置。
  • 在他們的圖書館中使用exit()die()的人:立即轉儲圖書館,沒有理由對有任何信任。

不幸的是,致命錯誤往往是致命的。沒有例外。但是,這就是我們在error_log(上)& display_errors(關閉生產,在開發)指令。