Link Search Menu Expand Document

Exceptions

MadelineProto can throw lots of different exceptions.

try {
    $MadelineProto->someMethod();
} catch (\danog\MadelineProto\RPCErrorException $e) {
    if ($e->rpc === 'BOT_METHOD_INVALID') {
        \danog\MadelineProto\Logger::log("Bots can't execute this method!");
    } else {
        $MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => 'An error occurred while calling someMethod: '.$e]);
    }
}

List of exception types

  • \danog\MadelineProto\Exception - Default exception, thrown when a php error occures and in a lot of other cases

  • \danog\MadelineProto\RPCErrorException - Thrown when an RPC error occurres (an error received via the MTProto API): note that the error message of this exception is localized in English, and may vary: to fetch the original API error message use $e->rpc.

  • \danog\MadelineProto\TL\Exception - Thrown on TL serialization/deserialization errors

  • \danog\MadelineProto\ResponseException - Thrown when an unexpected message is received through the socket

  • \danog\MadelineProto\NothingInTheSocketException - Thrown if no data can be read/written on the TCP socket

  • \danog\MadelineProto\PTSException - Thrown if the PTS is unrecoverably corrupted

  • \danog\MadelineProto\SecurityException - Thrown on security problems (invalid params during generation of auth key or similar)

  • \danog\MadelineProto\TL\Conversion\Exception - Thrown if some param/object can’t be converted to/from bot API/TD/TD-CLI format (this includes markdown/html parsing)

Pretty TL trace

Every exception features a custom stack trace called pretty TL trace, that makes finding bugs really easy:

php > $MadelineProto->messages->sendMessage(peer: '@dd', message: 'hi');

Uncaught \danog\MadelineProto\Exception: This peer is not present in the internal peer database in /home/pwrtelegram/cleanMadeline/src/MTProtoTools/PeerHandler.php:330
Revision: 63823fc3cc5070bd8a1ebe91e60e1fd583a2f37f

TL Trace (YOU ABSOLUTELY MUST READ THE TEXT BELOW):

PeerHandler.php(327):   getInfo("dd",false)
TL.php(339):            getInfo("dd")['peer']
While serializing:      messages.sendMessage
CallHandler.php(79):    serializeMethod("messages.sendMessage",{"peer":"@dd","message":"hi"})
APIFactory.php(142):    methodCall("messages.sendMessage",{"peer":"@dd","message":"hi"},{"datacenter":4})
php shell code(1):      __call("sendMessage",[{"peer":"@dd","message":"hi"}])
  thrown in /home/pwrtelegram/cleanMadeline/src/MTProtoTools/PeerHandler.php on line 330
php >

Explanation:

Uncaught \danog\MadelineProto\Exception: an exception of type \danog\MadelineProto\Exception was thrown and not caught using a catch block, like showed in the first example of this page.

This peer is not present in the internal peer database: this error means you have tried sending a message to a peer that does not exist or is not present in MadelineProto’s internal peer database: in fact, @dd is not a valid telegram username.

in /home/pwrtelegram/cleanMadeline/src/MTProtoTools/PeerHandler.php:330: this indicates the line where this error was thrown

Revision: 63823fc3cc5070bd8a1ebe91e60e1fd583a2f37f: this indicates the MadelineProto version: always include this code when opening github issues or reporting errors in the group.

PeerHandler.php(327):   getInfo("dd",false)
TL.php(339):            getInfo("dd")
['peer']
While serializing:      messages.sendMessage
CallHandler.php(79):    serializeMethod("messages.sendMessage",{"peer":"@dd","message":"hi"})
APIFactory.php(142):    methodCall("messages.sendMessage",{"peer":"@dd","message":"hi"},{"datacenter":4})
php shell code(1):      __call("sendMessage",[{"peer":"@dd","message":"hi"}])

This part is supposed to be read from bottom to top, the most important parts are:

While serializing: messages.sendMessage: this means the error was thrown while serializing the method call for messages->sendMessage

['peer']: this means the error was thrown while trying to serialize the peer parameter, so you should fix that part of your code:

$MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => 'hi']);

Getting the TL trace

To get the whole TL trace as string, cast the exception object to string:

NOTE: Due to the async nature of MadelineProto 4.0, sometimes the exception that is thrown and logged may not be the actual exception that caused the crash of the script.
To let me properly debug the issue, when reporting issues you also have to provide full logs.

try {
    // stuff
} catch (\danog\MadelineProto\Exception $e) {
    $estring = (string) $e;
    $estring2 = 'This also works: '.$e;
    $estring3 = "So does this: $e";
    // use $estring to report the error using sendMessage or log
}

Next section