我有一个静态类,我希望能够处理致命错误。我正在粘贴下面的方法,以便您更好地理解我的意思:
public static function getInformationDataArrayWithJsonInput($formConfigType, $application_data_json){
set_error_handler('myErrorHandler');
register_shutdown_function('fatalErrorShutdownHandler');
$ret = [];
$formConfigs = FormConfig::find(array('form_config_type_id='.$formConfigType, 'order" => "ordination ASC'));
if($formConfigs->count() == 0)
return $ret;
$json = $application_data_json;
//-----------------------------------------------------
$jsonObj = json_decode($json);
foreach ($formConfigs as $field){
$str = "if(\$jsonObj->".$field->json_property."){";
$str .= "\$ret['".$field->label."'] = \$jsonObj->".$field->json_property.";";
$str .= "} else {";
$str .= "\$ret['".$field->label."']=null;";
$str.="}";
try{
eval($str);
}
catch (Exception $e)
{
die($e->getMessage());
}
}
return $ret;
}
function fatalErrorShutdownHandler()
{
die('fatalErrorShutdownHandler');
$last_error = error_get_last();
if ($last_error['type'] === E_ERROR) {
// fatal error
myErrorHandler(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
}
}
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
die('myErrorHandler');
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
此方法接收json
和一个字符串,其中包含我想从中检索值的属性。 myErrorHandler和fatalErrorShutDownHandler根据this article实现
假设我将products[1].limits[0].value
作为json属性传递,并且没有products[1]
这将导致致命错误,因此我必须返回null。这是我的问题,我无法进入捕获区进行适当的治疗。
答案 0 :(得分:0)
您不需要在此处使用eval
,并应尽可能避免使用$jsonObj = json_decode($json);
foreach ($formConfigs as $field) {
$prop = $field->json_property;
$label = $field->label;
$ret[$label] = property_exists($jsonObj, $prop) ? $jsonObj->$prop : null;
}
。变量属性名称很容易做到,通过使用中间变量,您可以更容易阅读。然后一个简单的property_exists()
为你工作。
<ListBox x:Name="lstServers" HorizontalAlignment="Left" Height="285" Margin="20,37,0,0" VerticalAlignment="Top" Width="215"
ItemsSource="{Binding Settings.Servers}"
SelectedItem="{Binding Settings.ManageSelectedServer, Mode=TwoWay}"
DisplayMemberPath="UserFriendlyName"/>