Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异常(try,catch)在php中是如何工作的?_Php_Exception_Try Catch - Fatal编程技术网

异常(try,catch)在php中是如何工作的?

异常(try,catch)在php中是如何工作的?,php,exception,try-catch,Php,Exception,Try Catch,我不知道异常是如何工作的。我认为,它们应该避免php错误并显示“我的错误消息”。例如,我想打开文件 class File{ public $file; public function __construct($file) { try{ $this->file = fopen($file,'r'); } catch(Exception $e){ echo "some error" .

我不知道异常是如何工作的。我认为,它们应该避免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');
它起作用了。现在我故意将文件名
text.txt
更改为
tex.txt
,只是为了查看catch块中的错误消息,但是php给出了一个错误
警告:fopen(/var/www/html/OOP/text.txt):无法打开流:第169行的/var/www/html/OOP/file.php中没有这样的文件或目录。所以这是php错误,它不显示来自catch块的错误消息。我做错了什么?try/catch究竟是如何工作的?

来自PHP手册

如果打开失败,将生成E_级警告错误。你可以 使用@可取消显示此警告

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

因为“警告”不是错误。您只能捕获实际抛出的异常。因此,对于本例,您必须编写自己的验证代码,以确认您确实打开了一个文件。请阅读此处如何“捕获”警告:并非每个PHP语句/函数都会抛出异常。你只能听懂别人说的话,谢谢你的回复。你能告诉我,如果我必须添加
@
并且还要检查false/null
如果(!$this->file)
那么使用try-catch有什么意义?似乎我可以在没有try-catch的情况下使用
if
操作符检查文件,结果是一样的@მაზა ფაკა 如果需要,
try{}catch
块可以在类之外,但是要使用的
if()
不能在类之外。深入阅读主题ExceptionHandling,ExceptionTypes UserDefinedExceptions:-)try catch
块应该在类之外使用,在抛出异常的方法中它是非常无用的。我认为我应该更深入地了解异常的工作原理。谢谢你们