如何在IBAN校验函数中捕获异常并返回false
修改IBAN校验函数,异常时返回false
要让你的IBAN校验函数在出现异常时返回false而不是抛出异常,核心思路是用**try-catch块包裹所有可能出错的逻辑**,捕获所有异常(包括PHP7+的错误类型),并在捕获时返回false。以下是具体的修改方案:
完整修改后的函数
function checkIBAN($iban) { try { // 临时将警告/通知转成异常,确保所有错误都能被捕获 set_error_handler(function($errno, $errstr) { throw new \RuntimeException($errstr, $errno); }); $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 ); // 基础校验:国家代码是否存在 if (!isset($Countries[substr($iban, 0, 2)])) { return false; } // 基础校验:长度是否符合对应国家规则 if (strlen($iban) !== $Countries[substr($iban, 0, 2)]) { return false; } // IBAN校验核心逻辑 $ibanRearranged = substr($iban, 4) . substr($iban, 0, 4); $ibanNumeric = ''; for ($i = 0; $i < strlen($ibanRearranged); $i++) { $char = $ibanRearranged[$i]; $ibanNumeric .= ctype_alpha($char) ? (ord($char) - ord('a') + 10) : $char; } // 计算模97,结果为1则有效 $mod = bcmod($ibanNumeric, '97'); return $mod === '1'; } catch (\Exception $e) { // 捕获所有常规异常(比如运行时异常、自定义异常) return false; } catch (\Error $e) { // 捕获PHP7+的致命错误(比如调用未定义函数、数组越界等) return false; } finally { // 恢复系统默认的错误处理器,避免影响其他代码 restore_error_handler(); } }
关键修改点说明
try-catch包裹核心逻辑
把所有可能触发异常或错误的代码都放进try块,包括字符串处理、数组访问、循环计算等。通过两个catch块分别捕获Exception(常规异常)和Error(PHP7+致命错误),确保所有异常场景都能被覆盖。将警告/通知转成异常
用set_error_handler把PHP的警告、通知等非致命错误转成RuntimeException,这样即使是比如$iban为null时调用str_replace的警告,也能被捕获并返回false。最后在finally块恢复默认错误处理器,避免影响函数外的代码执行。保留原有校验逻辑
原函数中的基础校验(国家代码不存在、长度不符合规则)属于正常的校验失败,直接返回false即可,不需要放到异常处理里。
这样修改后,无论函数执行时遇到什么异常或错误,都会返回false,而不是抛出异常中断程序。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

