【问题标题】:PHPExcel Reader Exception throwingPHPExcel阅读器异常抛出
【发布时间】:2014-02-22 07:45:23
【问题描述】:

我正在尝试加载要使用 PHPExcel 阅读器对象读取的 excel 文件:

$inputFileName = $_FILES['excelimportfile']['tmp_name'];
 //Read your Excel workbook
     try {
           $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
           $objReader = PHPExcel_IOFactory::createReader($inputFileType);
           $objPHPExcel = $objReader->load($inputFileName);
         }catch(Exception $e) {
            $this->session->set_flashdata(
              'error','Error loading file "'.
               pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage()
            );
            redirect('admin/zipcode');
         }

但是谁会抛出异常呢?这 $objPHPExcel = $objReader->load($inputFileName); 行应该被用来生成我认为的异常。例如:

   $objPHPExcel = $objReader->load($inputFileName);
   if(!$objPHPExcel) throw new Exception($objPHPExcel->load_error(),1);

但我在任何地方都没有找到这样的东西。现在怎么办???

【问题讨论】:

  • 理论上,try { ... } 块中的这三个函数中的任何一个都可能引发异常...... 那些函数内部调用的函数也是如此,它一直是海龟下。此外,当抛出异常时,您将获得其完整堆栈,包括抛出它的特定文件/行。

标签: php mysql codeigniter-2 phpexcel phpexcelreader


【解决方案1】:

PHPExcel 库中的代码本身会抛出异常,而不是返回 false 作为错误状态,因为您的最后一条评论似乎表明它应该这样做;这表明您并不真正了解异常的工作原理或它们的目的。

PHPExcel 从库中的任何位置抛出的异常都可以被您的代码捕获和处理,无论它们是从库中的哪个位置抛出的

load() 方法中有一大堆逻辑可以引发异常(格式错误的文件就是一个例子),但 identify() 中的逻辑也可以引发异常(如果指定的文件不存在) , 或者无法读取,那么 identify() 方法会抛出异常)....

但很难准确理解您的要求。如果你看代码给读者看,那些类中可以抛出异常的方法都记录在 phpdoc 块中,你可以在类代码中看到实际抛出异常的位置。

【讨论】:

  • 对您的声誉表示尊重并知道您是 PHPExcel 的作者之一 我可以说我在这里的要求是要明确 PHPEx 读者的异常将如何被捕获.. 至少在那里必须是一些投掷者因为我们都知道没有投掷没有接球是有效的。因此,如果最后一行、中间行或第一行生成异常,它会自动抛出到我的 catch 块中吗?先生怎么样?
  • 如果 identify()、createReader() 或 load() 方法或由这些方法调用的任何方法抛出任何异常,无论调用树有多深,它们都会被捕获通过第一个示例的 catch 块......这就是异常在 PHP 中的工作方式
  • 这意味着如果在我之前有 4 级深度 try catch。所有这些 catch 都必须抛出它,以便该行中的最后一个 catch 得到它(如果我错了,请纠正我)。我不同意你所说的关于 PHP 的异常处理。你可以在你的 shell 上试​​试这个:try{$x=strtotime("xyz"); var_dump($x);} catch(Exception $e){ echo "Hi";} 根据你的说法.. 它应该打印 "Hi" 。但是看看它打印了什么。问候
  • 但是 PHPExcel 中没有 4 个级别的捕获:除了一些小异常,PHPExcel 会为您的脚本抛出一个异常来处理捕获...并且 strtotime() 不会抛出异常完全如此,因此将 strtotime() 包装在 try/catch 块中是没有意义的……除非您将错误处理更改为抛出异常,否则 Exception 与错误不同;您可以这样做,但这不是 PHP 的默认行为
  • 异常的全部意义在于它们不必必须在调用堆栈的每一级处理,它们只是将调用堆栈向上冒泡到第一个捕获
猜你喜欢
  • 2020-10-24
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多