“处理”;未定义索引“;在PHP中使用SYmfony

“处理”;未定义索引“;在PHP中使用SYmfony,php,exception,symfony,error-handling,dry,Php,Exception,Symfony,Error Handling,Dry,我正在用Symfony 2构建一个应用程序,我想知道,当我试图读取一个不存在的数组中的索引时,如何处理错误?遗憾的是,这种错误不会抛出异常,所以我不能真正使用try-catch块 例如: $test=array(); $test[“323”];//未定义的索引错误! 请问,如何处理这些错误 更新:我已经看到了许多使用isset的解决方案。这样做的问题是,我必须在每次访问数组索引时都这样做。有谁能给我一种更干的溶液吗?使用,比如 两者: 及 将允许您在尝试使用数组索引之前检查数组索引是否已定义。

我正在用Symfony 2构建一个应用程序,我想知道,当我试图读取一个不存在的数组中的索引时,如何处理错误?遗憾的是,这种错误不会抛出异常,所以我不能真正使用try-catch块

例如:

$test=array();
$test[“323”];//未定义的索引错误!
请问,如何处理这些错误

更新:我已经看到了许多使用
isset的解决方案
。这样做的问题是,我必须在每次访问数组索引时都这样做。有谁能给我一种更干的溶液吗?

使用,比如

两者:

将允许您在尝试使用数组索引之前检查数组索引是否已定义。这不是特定于Symfony的错误。每当您试图访问不存在的数组元素时,就会出现一个常见的PHP警告

$val = isset($test["323"]) ? $test["323"] : null;

您可以通过isset捕捉到它周围的bx:
if(isset($test[“323”])){
//此键的值已设置。

}

您是否希望实现这一目标

$test = array();
$test[]="323";

echo $test[0];//323 
一种选择是使用,以便以某种方式模拟异常。下面是一个示例用法,尽管我相信您可以根据具体的用例进行调整:

function my_error_handler($errno,$errstr)
  {
  /* handle the issue */
  return true; // if you want to bypass php's default handler
  }

$test = array();
set_error_handler('my_error_handler');
$use_it=$test["323"]; // Undefined index error!
restore_error_handler();

您可以看到,我们围绕
设置错误处理程序()
恢复错误处理程序()
来“包装”我们的“关键”代码。所讨论的代码可以小到一行,也可以大到整个脚本。当然,临界区越大,错误处理程序就越“智能化”。

尝试/捕获未定义或许多php错误的简单方法

try{
    set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext){
       if (0 === error_reporting()) { return false; }
       throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    });
    
    $data = $json['name']; ---> Undefined Index name
}catch(Exception $e){
    //Perform Furthur action 
}

检查
if(isset($test[“323”])
如何?这是一个PHP问题,而不是一个Symfony问题:。问题可能是+1的重复,因为设置额外的代码测试变量非常烦人,例如在使用
或类似的回退时。在我的情况下,使用logged to Symfony logger也不起作用。根据PHP,doc@没有禁止调用自定义错误处理程序。如链接页面上的注释所述,这取决于自定义处理程序是否遵守单个抑制。因此,它与Symfony的关系比与PHP的关系更大。。。最终,这个问题也不是链接线程的复制品。这看起来更像我想要的!但是我想知道如何处理这个问题…@Dbugger:嗯,我想这取决于应用程序逻辑。在这种情况下你希望发生什么?我猜您需要一些自定义故障转移(plan-B)过程来接管和解决问题。哦,您的意思是“My_error_handler”中的内容相当于“catch”块?我以为这就是执行“投掷”的地方。你能给我举个例子吗,你喜欢什么样的错误处理方法?另外,当在try-catch块中时,这个错误处理程序是如何处理的?我认为我提供的链接有更好的例子,我可以在这里提供。还有一个很好的解释,说明了这些函数是如何工作的,以及可以传递哪些其他参数。@Dbugger大多数情况下,您应该知道数组中的内容。但是如果我加载的是yaml或INI文件,我的客户可以自定义,它可能会破坏这些内容。仍然不是问题的关键question@Dbugger在页面加载时,是否通过循环加载ini文件?并且每个设置都有默认值,以防它们在ini文件中不存在?可能的解决方案,但可能不适用于所有情况
$test = array();
$test[]="323";

echo $test[0];//323 
function my_error_handler($errno,$errstr)
  {
  /* handle the issue */
  return true; // if you want to bypass php's default handler
  }

$test = array();
set_error_handler('my_error_handler');
$use_it=$test["323"]; // Undefined index error!
restore_error_handler();
try{
    set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext){
       if (0 === error_reporting()) { return false; }
       throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    });
    
    $data = $json['name']; ---> Undefined Index name
}catch(Exception $e){
    //Perform Furthur action 
}