当我在 Magento 中以非常大$sku
的 执行以下语句时,执行终止而不会抛出任何错误。Magento、Apache 或 PHP 的错误日志中都没有错误。
Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);
问题:如何捕获错误?
我尝试设置自定义错误处理程序,并且出于测试目的,我还设法触发了调用每个错误处理程序函数的错误情况。但是当运行前面提到的带有大的 Magento 代码时$sku
,不会执行任何错误处理函数。
error_reporting( -1 );
set_error_handler( array( 'Error', 'captureNormal' ) );
set_exception_handler( array( 'Error', 'captureException' ) );
register_shutdown_function( array( 'Error', 'captureShutdown' ) );
为了完整起见,这是$sku
我传递给loadByAttribute()
. (sku 无效,但这不是问题)
1- 9685 0102046 | 1- 9685 1212100 | 1- 9685 1212092 | 1- 9685 1212096 | 1- 9685 1102100 | 1- 9685 1102108 | 1- 9685 1- 9685 0102056|1- 9685 0102058|1- 9685 1212104|1- 9685 1212108|1- 9685 0212058|1- 9685 0104050|1- 9685 0212050|1- 9685 0212056|1- 9685 0212044|1- 9685 0212048| 1- 9685 0212052|1- 9685 0212054|1- 9685 1102104|1- 9685 1102124
非常感谢您对此事的任何见解!
更新:经过进一步调查,这是代码中执行终止的确切点。当执行 foreach 时,我猜 Magento 进入 MySQL 世界并开始从数据库加载数据。
\Mage\Catalog\Model\Abstract.php
public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
{
$collection = $this->getResourceCollection()
->addAttributeToSelect($additionalAttributes)
->addAttributeToFilter($attribute, $value)
->setPage(1,1);
foreach ($collection as $object) { // <--------------- HERE
return $object;
}
return false;
}
请注意,我只对找出如何正确捕获这些类型的错误感兴趣,而不是“修复”逻辑。这样我就可以向用户显示正确的错误消息。上面带有畸形 sku 的示例是人为的,我不想让我的 Magento 应用程序与那些错误的 sku 一起工作。
更新:错误原因
我跟踪了load()
由 触发的调用,foreach
它归结为一个错误 Zend / PHP。
我追踪了对 \www\lib\Zend\Db\Statement.php 的调用_stripQuoted($sql)
,以及以下语句:(
$sql = preg_replace("/$q($qe|\\\\{2}|[^$q])*$q/", '', $sql);
在 Magento 1.7.0.2 的第 204 行)。
当preg_replace
使用该语句生成的 SQL 运行时load()
,程序就终止了。apache 或 php 的日志中都没有任何痕迹。日志有效,因为它们充满了其他东西。
我在这个问题上找到了这个错误报告。他们在那里表明这是一个分段错误。我想没有办法从中恢复(?)。
由于问题明确是关于如何捕获错误条件,而且这里的许多建议更多是关于清理数据,我认为赏金没有明确的“赢家”。但 Franklin P Strube 至少暗示要在筹码更深的地方过牌,所以他明白了。
谢谢你们所有的帮助。如果您对如何处理段错误有任何建议,请分享 =)。