douye4254 2013-12-18 17:28
浏览 42
已采纳

如何包装try catch或其他错误处理

I'm a little new to OOP in PHP. I was putting together an ip to location code from MaxMind, and wanted to wrap some error handling around it, because if you supply it with an incorrect IP address, or the database is corrupt, it'll throw a fatal error.

Most of my code is stock code, but I cannot get the error handling part correct.

Here's the stock code. The idea here is to set $countryCode = 'UN' and $countryName = 'Unknown' initially, and then, if the script works, set it to whatever depending on the Ip address supplied.

Stock Code

require_once($_SERVER['DOCUMENT_ROOT'].'\vendor\autoload.php');
use GeoIp2\Database\Reader;

$countryCode = 'UN';
$countryName = 'Unknown';

$reader = new Reader($_SERVER['DOCUMENT_ROOT'].'\geoip\GeoLite2-City.mmdb');

$record = $reader->city('24.22.173.253');
$countryCode = $record->country->isoCode . '<br>'; // 'US'
$countryName = $record->country->name . '<br>'; // 'United States'

echo $countryCode;
echo $countryName;

I tried

require_once($_SERVER['DOCUMENT_ROOT'].'\vendor\autoload.php');
use GeoIp2\Database\Reader;

$countryCode = 'UN';
$countryName = 'Unknown';

try{
$reader = new Reader($_SERVER['DOCUMENT_ROOT'].'\geoip\GeoLite2-City.mmdb');
}
catch(Exception $e)
  {
  echo 'Message: ' .$e->getMessage();
  }

$record = $reader->city('24.22.173.253');
$countryCode = $record->country->isoCode . '<br>'; // 'US'
$countryName = $record->country->name . '<br>'; // 'United States'

echo $countryCode;
echo $countryName;

However, this is what I'm trying to do:

require_once($_SERVER['DOCUMENT_ROOT'].'\vendor\autoload.php');
use GeoIp2\Database\Reader;


$countryCode = 'UN';
$countryName = 'Unknown';

**If (the below is successful -> the db is successfully opened)**
$reader = new Reader($_SERVER['DOCUMENT_ROOT'].'\geoip\GeoLite2-City.mmdb');
then (proceed with the below){
$record = $reader->city('24.22.173.253');
$countryCode = $record->country->isoCode . '<br>'; // 'US'
$countryName = $record->country->name . '<br>'; // 'United States'
}
else
//Send an email to the admin here

echo $countryCode;
echo $countryName;

I cant use if() here, how is this done using try catch? In all there's no need to halt the script. Let the default values of $countryCode and $countryName remain if the i[ detect does not succeed.

The code in the MaxMind script is done this way:

if (!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
            throw new \InvalidArgumentException(
                "The value \"$ipAddress\" is not a valid IP address."
            );
        }
  • 写回答

1条回答 默认 最新

  • dongmiyu8979 2013-12-18 17:31
    关注

    If any line within a try block throws an exception, future lines are not ran and the catch block is ran instead. So you can safely move those lines into the try block:

    require_once($_SERVER['DOCUMENT_ROOT'].'\vendor\autoload.php');
    use GeoIp2\Database\Reader;
    
    $countryCode = 'UN';
    $countryName = 'Unknown';
    
    try {
        $reader = new Reader($_SERVER['DOCUMENT_ROOT'].'\geoip\GeoLite2-City.mmdb');
        $record = $reader->city('24.22.173.253');
        $countryCode = $record->country->isoCode . '<br>'; // 'US'
        $countryName = $record->country->name . '<br>'; // 'United States'
    } catch(Exception $e) {
        // Send an email to the admin here instead of echo'ing $e->getMessage()
        // if that's what you want to do.
        echo 'Message: ' .$e->getMessage();
    }
    
    echo $countryCode;
    echo $countryName;
    

    Now, if the first line of the try block throws an exception, the other three lines won't be executed. Instead, the catch block will be executed. So that is where you can send your email to the admin.

    (If the $reader = line throws an exception, the $record = line will not be executed, nor will subsequent lines within the try block.)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 C++实现删除N个数据列表共有的元素
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码