Поймать конкретный экземпляр исключения PHP (PDFlib)

У меня есть скрипт, использующий библиотеку PDFlib в PHP, который мне нужно перебрать через кучу блоков и сообщить мне их имена и описания (если описание существует). PDFlib всегда выдает исключение, когда $pdf->pcos_get_string() звонок не получается, поэтому мне нужно его перехватить.

Проблема в том, что мне нужно продолжить выполнение моего цикла после того, как это конкретное выполнение будет сгенерировано. Это не кажется большой проблемой, но мой цикл перестает выполняться после того, как исключение выдается и перехватывается. Не у каждого блока будет описание, поэтому я не могу предположить, что они есть.

Код ниже:

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 с описанием вашего почтового индекса

… (шестнадцать строк этого)

Мой вывод на самом деле выглядит так:

Найден блок Адрес с описанием Где вы живете

Найден блок Имя с описанием Ваше имя

Найдено состояние блока без описания

Моя настоящая проблема заключается в том, что скрипт перестает выполняться в середине моего цикла, как только он заканчивает обработчик исключений. Что мне нужно сделать, чтобы цикл продолжал выполняться?

Заранее спасибо за помощь.

1

Решение

как только возникает исключение, объект PDFlib больше не может использоваться. (см. PDFlib 9 Tutorial, глава 3.1.1 «Обработка исключений»):
«Важно понимать, что сгенерированный PDF-документ не может быть завершен при возникновении исключения»

Таким образом, решение немного отличается:

  • позаботьтесь, чтобы исключений не было. Вы должны проверить, если свойство блока вы
    попытаться получить доступно.
  • Вы можете сделать это с префиксом «type:» к пути pCOS. В рамках учебника PDFlib 9
    В главе 12.7 «Запрос имен блоков и свойств с помощью pCOS» вы найдете следующее
    объяснение:

Несуществующие свойства блока и значения по умолчанию. Используйте префикс типа, чтобы определить
присутствует ли блок или свойство на самом деле. Если для пути указан тип 0 или ноль, соответствующий объект отсутствует в документе 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 () возвращает для типа значение a! = 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/
Должен продемонстрировать все, что вам нужно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]