Как я могу бежать от исключения и получить ложь в этом случае

Добрый день, у меня есть этот код

 function checkIBAN($iban)
{
    $iban = strtolower(str_replace(' ','',$iban));
    $Countries = array('al'=>28,'ad'=>24,'at'=>20,'az'=>28,'bh'=>22,'be'=>16,'ba'=>20,'br'=>29,'bg'=>22,'cr'=>21,'hr'=>21,'cy'=>28,'cz'=>24,'dk'=>18,'do'=>28,'ee'=>20,'fo'=>18,'fi'=>18,'fr'=>27,'ge'=>22,'de'=>22,'gi'=>23,'gr'=>27,'gl'=>18,'gt'=>28,'hu'=>28,'is'=>26,'ie'=>22,'il'=>23,'it'=>27,'jo'=>30,'kz'=>20,'kw'=>30,'lv'=>21,'lb'=>28,'li'=>21,'lt'=>20,'lu'=>20,'mk'=>19,'mt'=>31,'mr'=>27,'mu'=>30,'mc'=>27,'md'=>24,'me'=>22,'nl'=>18,'no'=>15,'pk'=>24,'ps'=>29,'pl'=>28,'pt'=>25,'qa'=>29,'ro'=>24,'sm'=>27,'sa'=>24,'rs'=>22,'sk'=>24,'si'=>19,'es'=>24,'se'=>24,'ch'=>21,'tn'=>24,'tr'=>26,'ae'=>23,'gb'=>22,'vg'=>24);
    $Chars = array('a'=>10,'b'=>11,'c'=>12,'d'=>13,'e'=>14,'f'=>15,'g'=>16,'h'=>17,'i'=>18,'j'=>19,'k'=>20,'l'=>21,'m'=>22,'n'=>23,'o'=>24,'p'=>25,'q'=>26,'r'=>27,'s'=>28,'t'=>29,'u'=>30,'v'=>31,'w'=>32,'x'=>33,'y'=>34,'z'=>35);

    try{
        $cntr=(in_array(substr($iban,0,2),$Countries)) ? $Countries[substr($iban,0,2)] : false;
    if(strlen($iban) == $cntr){
        $MovedChar = substr($iban, 4).substr($iban,0,4);
        $MovedCharArray = str_split($MovedChar);
        $NewString = "";
        foreach($MovedCharArray AS $key => $value){
            if(!is_numeric($MovedCharArray[$key])){
                $MovedCharArray[$key] = $Chars[$MovedCharArray[$key]];
            }
            $NewString .= $MovedCharArray[$key];
        }
        if(bcmod($NewString, '97') == 1)
        {
            return TRUE;
        }
        else{
            return FALSE;
        }
    }
    else{
        return FALSE;
    }
    }catch (Exception $e) {
        report($e);
        return false;
    }

}

И я получаю это исключение в Laravel

{сообщение: "Неопределенное смещение: 21", исключение: "ErrorException",…} исключение: "ErrorException" "Неопределенное смещение: 21" в этой строке $ Страны [substr($iban,0,2)]

Как я могу бежать из исключения и получить только ложь в этом случае. Из-за того факта, что моя функция, которая проверяет iban, должна получать только true или false, а не исключение:) Если я получаю исключение, равное 500 ошибкам в Ajax http://prntscr.com/j4i3x6

1 ответ

На Packagist есть довольно много протестированных библиотек проверки iban. https://packagist.org/?q=iban&p=0 Я бы использовал один из них вместо этого.

Гораздо лучше, чем какой-то хрустящий код, скопированный с другого вопроса стека overoverflow

ErrorException - это обработчик ошибок laravel, превращающий ошибку php в исключение. Вы можете избежать ошибки, добавив проверки перед выполнением доступа к массиву.

Рассмотрим этот пример:

$MovedCharArray[$key] = $Chars[$MovedCharArray[$key]];

Предполагается, что $MovedCharArray имеет индекс $key и предполагает, что $Chars имеет индекс $MovedCharArray[$key], Если какой-либо из них не существует, вы получите эту ошибку.

Добавьте несколько проверок, прежде чем пытаться получить доступ к этим элементам массива, и вы сможете избежать ошибки.

if(isset($MovedCharArray[$key]) && isset($Chars[$MovedCharArray[$key]])){
  $MovedCharArray[$key] = $Chars[$MovedCharArray[$key]];
}else{
  //Some error condition you'll need to deal with.
}
Другие вопросы по тегам