2016-08-01 103 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'块应该在类的外部使用,在抛出异常的方法中这是非常没用的。 –