From 4a90ac270f8e3ddd544419274a08fdf85ee05202 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sat, 22 Nov 2014 13:52:36 +0100 Subject: [PATCH] Improved exception handling and debugging --- src/pocketmine/Server.php | 17 +++++++++++++++-- .../command/FormattedCommandAlias.php | 4 ++++ src/pocketmine/command/SimpleCommandMap.php | 4 ++++ src/pocketmine/network/RakLibInterface.php | 2 +- src/pocketmine/plugin/PluginManager.php | 6 ++++++ src/pocketmine/scheduler/ServerScheduler.php | 4 ++++ 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index e0c586650..6df778c66 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -2088,7 +2088,14 @@ class Server{ //Do level ticks foreach($this->getLevels() as $level){ - $level->doTick($currentTick); + try{ + $level->doTick($currentTick); + }catch (\Exception $e){ + $this->logger->critical("Could not tick level ".$level->getName().": ".$e->getMessage()); + if($this->logger instanceof MainLogger){ + $this->logger->logException($e); + } + } } } @@ -2197,7 +2204,13 @@ class Server{ } } - $this->generationManager->process(); + try{ + $this->generationManager->process(); + }catch (\Exception $e){ + if($this->logger instanceof MainLogger){ + $this->logger->logException($e); + } + } if(($this->tickCounter % 100) === 0){ foreach($this->levels as $level){ diff --git a/src/pocketmine/command/FormattedCommandAlias.php b/src/pocketmine/command/FormattedCommandAlias.php index 9dd63b61f..82bfb52d1 100644 --- a/src/pocketmine/command/FormattedCommandAlias.php +++ b/src/pocketmine/command/FormattedCommandAlias.php @@ -22,6 +22,7 @@ namespace pocketmine\command; use pocketmine\Server; +use pocketmine\utils\MainLogger; use pocketmine\utils\TextFormat; class FormattedCommandAlias extends Command{ @@ -49,6 +50,9 @@ class FormattedCommandAlias extends Command{ $sender->sendMessage(TextFormat::RED . $e->getMessage()); }else{ $sender->sendMessage(TextFormat::RED . "An internal error occurred while attempting to perform this command"); + if(($logger = $sender->getServer()->getLogger()) instanceof MainLogger){ + $logger->logException($e); + } } return false; diff --git a/src/pocketmine/command/SimpleCommandMap.php b/src/pocketmine/command/SimpleCommandMap.php index 44a85d312..9e47e6b4d 100644 --- a/src/pocketmine/command/SimpleCommandMap.php +++ b/src/pocketmine/command/SimpleCommandMap.php @@ -56,6 +56,7 @@ use pocketmine\command\defaults\VanillaCommand; use pocketmine\command\defaults\VersionCommand; use pocketmine\command\defaults\WhitelistCommand; use pocketmine\Server; +use pocketmine\utils\MainLogger; class SimpleCommandMap implements CommandMap{ @@ -182,6 +183,9 @@ class SimpleCommandMap implements CommandMap{ $target->execute($sender, $sentCommandLabel, $args); }catch(\Exception $e){ $this->server->getLogger()->critical("Unhandled exception executing command '". $commandLine ."' in ". $target.": ".$e->getMessage()); + if(($logger = $sender->getServer()->getLogger()) instanceof MainLogger){ + $logger->logException($e); + } } $target->timings->stopTiming(); diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index b389581a2..1bb3f9d05 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -184,8 +184,8 @@ class RakLibInterface implements ServerInstance, SourceInterface{ if(\pocketmine\DEBUG > 1){ $logger = $this->server->getLogger(); if($logger instanceof MainLogger){ - $logger->logException($e); $logger->debug("Packet ".get_class($pk)." 0x".bin2hex($packet->buffer)); + $logger->logException($e); } } } diff --git a/src/pocketmine/plugin/PluginManager.php b/src/pocketmine/plugin/PluginManager.php index 9701713e8..ce1ed8e7d 100644 --- a/src/pocketmine/plugin/PluginManager.php +++ b/src/pocketmine/plugin/PluginManager.php @@ -251,6 +251,9 @@ class PluginManager{ } }catch(\Exception $e){ $this->server->getLogger()->error("Could not load '" . $file . "' in folder '" . $directory . "': " . $e->getMessage()); + if(($logger = $this->server->getLogger()) instanceof MainLogger){ + $logger->logException($e); + } } } } @@ -666,6 +669,9 @@ class PluginManager{ $registration->callEvent($event); }catch(\Exception $e){ $this->server->getLogger()->critical("Could not pass event ". $event->getEventName() ." to ". $registration->getPlugin()->getDescription()->getFullName() .": ".$e->getMessage()." on ".get_class($registration->getListener())); + if(($logger = $this->server->getLogger()) instanceof MainLogger){ + $logger->logException($e); + } } } } diff --git a/src/pocketmine/scheduler/ServerScheduler.php b/src/pocketmine/scheduler/ServerScheduler.php index a79589518..7b3ce1b66 100644 --- a/src/pocketmine/scheduler/ServerScheduler.php +++ b/src/pocketmine/scheduler/ServerScheduler.php @@ -26,6 +26,7 @@ namespace pocketmine\scheduler; use pocketmine\plugin\Plugin; use pocketmine\Server; +use pocketmine\utils\MainLogger; use pocketmine\utils\PluginException; use pocketmine\utils\ReversePriorityQueue; @@ -236,6 +237,9 @@ class ServerScheduler{ $task->run($this->currentTick); }catch (\Exception $e){ Server::getInstance()->getLogger()->critical("Could not execute task ". $task->getTaskName() .": ".$e->getMessage()); + if(($logger = Server::getInstance()->getLogger()) instanceof MainLogger){ + $logger->logException($e); + } } $task->timings->stopTiming(); }