MadelineProtoDocs/docs/docs/EXCEPTIONS.md

115 lines
5.2 KiB
Markdown

---
title: Exceptions
description: MadelineProto can throw lots of different exceptions.
image: https://docs.madelineproto.xyz/favicons/android-chrome-256x256.png
---
# Exceptions
MadelineProto can throw lots of different exceptions.
```php
try {
$MadelineProto->getDialogs();
} 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 getDialogs: '.$e]);
}
}
```
* [List of exception types](#list-of-exception-types)
* [Pretty TL trace](#pretty-tl-trace)
* [Getting the TL trace](#getting-the-tl-trace)
## 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
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/danog/MadelineProto/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/danog/MadelineProto/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/danog/MadelineProto/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**:
```php
$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**](LOGGING.html).
```php
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
}
```
<a href="https://docs.madelineproto.xyz/docs/FLOOD_WAIT.html">Next section</a>