【问题标题】:Catch a Specific Instance of a PHP Exception (PDFlib)捕获 PHP 异常的特定实例 (PDFlib)
【发布时间】:2014-09-22 19:40:36
【问题描述】:

我有一个使用 PHP 中的 PDFlib 库的脚本,我需要遍历一堆块并告诉我它们的名称和描述(如果存在描述)。当$pdf->pcos_get_string() 调用失败时,PDFlib 总是会抛出异常,所以我需要捕获它。

问题是我需要在抛出特定执行后继续执行我的循环。这似乎不是什么大问题,但我的循环在抛出并捕获异常后停止执行。不是每个块都有描述,所以我不能只是假设它们有。

代码如下:

try{
    $num_blocks = $pdf->pcos_get_number($input_file,'length:pages[0]/blocks');

    for($i=0;$i<$num_blocks;$i++){
        # This works fine
        $block_name = $pdf->pcos_get_string($input_file,'pages[0]/blocks['.$i.']/Name');

        try{
            # This will always throw an exception when there is no description
            $block_desc = $pdf->pcos_get_string($input_file,'pages[0]/blocks['.$i.']/Description');
        }catch(PDFlibException $e){
            # I want to print this, then go to the next loop iteration
            print 'Found block '.$block_name.' with no description'.PHP_EOL;
            continue;
        }catch(Exception $e){
            print 'Some other exception occurred'.PHP_EOL;
        }

        if($block_desc)
            # Print the block name
            print 'Found block '.$block_name.' with description '.$block_desc.PHP_EOL;
        }
}catch(PDFlibException $e){
    print $e;
    exit(1);
}catch(Exception $e){
    print $e;
    exit(1);
}

我希望输出如下:

找到带有描述您居住地的区块地址

找到块名称和描述你的名字

找到没有描述的块状态

找到带有描述您的邮政编码的块 Zip

...(这十六行)

我的输出实际上是这样的:

找到带有描述您居住地的区块地址

找到块名称和描述你的名字

找到没有描述的块状态

我真正的问题是,一旦脚本完成异常处理程序,它就会在我的循环中间停止执行。我需要做什么来确保循环继续执行?

提前感谢您的帮助。

【问题讨论】:

    标签: php exception-handling pdflib


    【解决方案1】:

    一旦发生异常,就不能再使用 PDFlib 对象。 (请参阅 PDFlib 9 教程,第 3.1.1 章“异常处理”): "发生异常时无法完成生成的 PDF 文档,了解这一点很重要"

    所以解决方案略有不同:

    • 小心,不要发生异常。你应该检查你的块属性 尝试检索可用。
    • 您可以这样做,在 pCOS 路径前加上前缀“type:”。在 PDFlib 9 教程中 第 12.7 章“使用 pCOS 查询块名称和属性”您会发现以下内容 解释:

    不存在的块属性和默认值。使用类型前缀确定 块或属性是否实际存在。如果路径的类型为 0 或 null,则 PDF 文档中不存在相应的对象。请注意,对于预定义的属性 这意味着将使用属性的默认值。

    因此,上述块描述的简单示例代码可能是:

        if ($pdf->pcos_get_number($input_file,'type:pages[0]/blocks['.$i.']/Description')!= 0){
                $block_desc = $pdf->pcos_get_string($input_file,'pages[0]/blocks['.$i.']/Description');
         }
    

    检查,如果 pcos_get_number() 为类型返回值!= 0(0 表示“空对象或对象不存在(用于检查对象的存在)”,请参阅 pCOS 路径参考,第 4.2 章,表 4.1 ) 如果此值可用,则可以检索不带前缀的字符串。

    您还可以使用类型值来创建更通用的代码,因为这样您 可以简单地确定是否必须检索字符串、数字、字典等。

    您可能会在 PDFlib 手册中找到完整的示例代码: http://www.pdflib.com/pdflib-cookbook/block-handling-and-pps/query-block-properties/php-query-block-properties/ 应该展示你需要的一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2018-06-28
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多