使用 Laravel 5.2 从库中捕获异常
Catching Exceptions from library using Laravel 5.2
laravel 很新,所以我不太确定它如何处理错误以及如何最好地捕获它们。
我正在使用第 3 方游戏服务器连接库,它可以查询游戏服务器以提取玩家、当前地图等数据。
这个库叫做蒸汽冷凝器: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 方库的问题吗?
几件事:
- 跟踪是导致 SocketException 还是其他错误?有可能在抛出 SocketException 之前捕获了不同的错误。
- 您的 catch 语句正在捕获
SocketException
。您是否在 PHP 文件的顶部导入了完整的命名空间? use SteamCondenser\Exceptions\SocketException;
同样出于调试目的,您可以执行异常 "catch all" 并转储异常类型:
try {
...
}catch(\Exception $e){
dd(get_class($e));
}
如果您在尝试上述代码后仍然得到堆栈跟踪,则在 try/catch 块开始之前抛出了一个错误。
laravel 很新,所以我不太确定它如何处理错误以及如何最好地捕获它们。
我正在使用第 3 方游戏服务器连接库,它可以查询游戏服务器以提取玩家、当前地图等数据。
这个库叫做蒸汽冷凝器: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 方库的问题吗?
几件事:
- 跟踪是导致 SocketException 还是其他错误?有可能在抛出 SocketException 之前捕获了不同的错误。
- 您的 catch 语句正在捕获
SocketException
。您是否在 PHP 文件的顶部导入了完整的命名空间?use SteamCondenser\Exceptions\SocketException;
同样出于调试目的,您可以执行异常 "catch all" 并转储异常类型:
try {
...
}catch(\Exception $e){
dd(get_class($e));
}
如果您在尝试上述代码后仍然得到堆栈跟踪,则在 try/catch 块开始之前抛出了一个错误。