2016-08-01 100 views
1

我不完全知道異常是如何工作的。正如我所假設的,他們應該避免php錯誤並顯示「我的錯誤信息」。例如,我想打開文件如何異常(嘗試,趕上)在PHP中工作?

class File{ 

    public $file; 

    public function __construct($file) 
    { 
     try{ 
      $this->file = fopen($file,'r'); 
     } 
     catch(Exception $e){ 
      echo "some error" . $e->getMessage(); 
     } 
    } 
    } 

    $file = new File('/var/www/html/OOP/texts.txt'); 

它的工作原理。現在我故意將文件名texts.txt更改爲tex.txt,只是爲了查看來自我的catch塊的錯誤消息,但是相反,php提供了一個錯誤Warning: fopen(/var/www/html/OOP/texts.txt): failed to open stream: No such file or directory in /var/www/html/OOP/file.php on line 169。所以它是PHP錯誤,它不顯示catch塊的錯誤信息。我究竟做錯了什麼? try/catch究竟是如何工作的?

+1

因爲「警告」不是錯誤。你只能捕獲實際拋出的異常。所以對於這個例子,你必須編碼你自己的驗證,你實際上打開了一個文件。 – Jeff

+2

在這裏閱讀如何「捕捉」一個警告:http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning – Jeff

+1

不是每個PHP語句/函數都會拋出異常。你只能抓到拋出什麼 – RiggsFolly

回答

1

從PHP手冊

如果打開失敗,將生成水平E_WARNING的誤差。您可能使用@來阻止此警告。

fopen返回FALSE出錯,所以你可以測試這個,並拋出一個將被捕獲的異常。一些原生的PHP函數會產生異常,其他的則會引發錯誤。

class File{ 
    public $file; 

    public function __construct($file){ 
     try{ 

      $this->file = @fopen($file,'r'); 
      if(!$this->file) throw new Exception('File could not be found',404); 

     } catch(Exception $e){ 
      echo "some error" . $e->getMessage(); 
     } 
    } 
} 
+0

感謝您的回覆。你可以告訴我,如果我不得不添加'@'並且檢查false/null if(!$ this-> file)'那麼使用try試圖捕獲什麼?好像我可以用'if'運算符檢查文件而沒有嘗試捕獲並且結果將會是相同的 –

+1

@valuesზაფაკა如果你想,'try {} catch'塊可以在類外部,但是'if()'那個你想使用不能在課外。閱讀更多主題ExeptionHandling,ExeptionTypes UserDefinedExeptions :-) – JustOnUnderMillions

+1

'try-catch'塊應該在類的外部使用,在拋出異常的方法中這是非常沒用的。 –