PhP - 如何捕获静态类中的致命错误

时间:2017-03-17 18:41:14

标签: php json

我有一个静态类,我希望能够处理致命错误。我正在粘贴下面的方法,以便您更好地理解我的意思:

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。这是我的问题,我无法进入捕获区进行适当的治疗。

你能帮帮我吗?

1 个答案:

答案 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"/>