【问题标题】:Catching Exceptions from library using Laravel 5.2使用 Laravel 5.2 从库中捕获异常
【发布时间】:2016-01-23 23:54:29
【问题描述】:

对 laravel 来说还是个新手,所以我不确定它如何处理错误以及如何最好地捕获它们。

我正在使用第 3 方游戏服务器连接库,它可以查询游戏服务器以提取玩家、当前地图等数据。

这个库叫做 Steam Condenser : https://github.com/koraktor/steam-condenser

我已经在我的项目中使用 composer 导入了这个,一切似乎都工作正常,但是我在捕获库抛出的异常时遇到了麻烦。

一个例子是您查询的游戏服务器离线。

这是我的代码:

public function show($server_name)
{
    try{
        SteamSocket::setTimeout(3000);
        $server = server::associatedServer($server_name);
        $server_info = new SourceServer($server->server_ip);

        $server_info->rconAuth($server->server_rcon);

        $players = $server_info->getPlayers();
        $total_players = count($players);

        $more_info = $server_info->getServerInfo();

        $maps = $server_info->rconExec('maps *');
        preg_match_all("/(?<=fs\)).*?(?=\.bsp)/", $maps, $map_list);    
    }catch(SocketException $e){
        dd("error");
    }
    return view('server', compact('server', 'server_info', 'total_players', 'players', 'more_info', 'map_list'));
}

如果服务器离线,它会抛出一个 SocketException,我试图捕捉它,但这似乎永远不会发生。然后我得到带有跟踪的错误页面。

这会引起一些问题,因为我希望简单地告诉最终用户服务器处于离线状态,但是如果我无法捕获此错误,我将无法执行此操作。

我的 try/catch 有问题吗? laravel 是否以这种方式处理捕获错误?这是第 3 方库的问题吗?

【问题讨论】:

    标签: php laravel error-handling steam-condenser


    【解决方案1】:

    几件事:

    • 跟踪会导致 SocketException 还是其他错误?可能在抛出 SocketException 之前捕获了不同的错误。
    • 您的 catch 语句正在捕获 SocketException。您是否在 PHP 文件的顶部导入了完整的命名空间? use SteamCondenser\Exceptions\SocketException;

    同样出于调试目的,您可以执行“catch all”异常并转储异常类型:

    try {
        ...
    }catch(\Exception $e){
        dd(get_class($e));
    }
    

    如果在尝试上述代码后仍然得到堆栈跟踪,则在 try/catch 块开始之前抛出错误。

    【讨论】:

    • 我认为这已经解决了 :) 不导入类一定是个问题,尽管我认为它会抛出一个 classNotFound 错误。我曾试图事先捕获任何异常,但仍然遇到同样的问题,尽管在开始之前我没有反斜杠。这样就解决了这个问题。感谢您的帮助!
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多