PHP中异常(try,catch)如何工作?

4

我不太清楚异常是如何工作的。我认为,它们应该避免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');

这段代码涉及到IT技术。现在我故意将文件名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
阅读此处有关如何“捕获”警告的内容:https://dev59.com/vHM_5IYBdhLWcg3ww2AQ - Jeff
1
并非每个PHP语句/函数都会抛出异常。你只能捕获被抛出的异常。 - RiggsFolly
1个回答

3

来自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();
       }
     }
}

谢谢您的回复。请问我是否需要添加 @ 并检查 false/null if( !$this->file ),那么使用 try catch 的意义是什么?似乎我可以使用 if 运算符检查文件而不需要 try catch,结果也会相同。 - devnull Ψ
1
@მაზა ფაკა 如果你想要,try{}catch块可以放在类外面,但是你想要使用的if()不能放在类外面。请深入了解异常处理、异常类型和用户定义异常等主题。 :-) - JustOnUnderMillions
1
try-catch 块应该在类的外部使用,在抛出异常的方法内部使用它是相当无用的。 - Charlotte Dunois
我觉得我应该更深入地研究异常处理以了解其工作原理。谢谢大家。 - devnull Ψ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接