Document the errors/ module

This commit is contained in:
Lonami Exo 2017-11-26 17:06:09 +01:00
parent a932fb6470
commit 71eb542626
3 changed files with 84 additions and 43 deletions

View File

@ -1,3 +1,7 @@
"""
This module holds all the base and automatically generated errors that the
Telegram API has. See telethon_generator/errors.json for more.
"""
import urllib.request import urllib.request
import re import re
from threading import Thread from threading import Thread
@ -13,6 +17,13 @@ from .rpc_error_list import *
def report_error(code, message, report_method): def report_error(code, message, report_method):
"""
Reports an RPC error to pwrtelegram.
:param code: the integer code of the error (like 400).
:param message: the message representing the error.
:param report_method: the constructor ID of the function that caused it.
"""
try: try:
# Ensure it's signed # Ensure it's signed
report_method = int.from_bytes( report_method = int.from_bytes(
@ -30,6 +41,14 @@ def report_error(code, message, report_method):
def rpc_message_to_error(code, message, report_method=None): def rpc_message_to_error(code, message, report_method=None):
"""
Converts a Telegram's RPC Error to a Python error.
:param code: the integer code of the error (like 400).
:param message: the message representing the error.
:param report_method: if present, the ID of the method that caused it.
:return: the RPCError as a Python exception that represents this error.
"""
if report_method is not None: if report_method is not None:
Thread( Thread(
target=report_error, target=report_error,

View File

@ -2,20 +2,23 @@
class ReadCancelledError(Exception): class ReadCancelledError(Exception):
"""Occurs when a read operation was cancelled""" """Occurs when a read operation was cancelled."""
def __init__(self): def __init__(self):
super().__init__(self, 'The read operation was cancelled.') super().__init__(self, 'The read operation was cancelled.')
class InvalidParameterError(Exception): class InvalidParameterError(Exception):
"""Occurs when an invalid parameter is given, for example, """
when either A or B are required but none is given""" Occurs when an invalid parameter is given, for example,
when either A or B are required but none is given.
"""
class TypeNotFoundError(Exception): class TypeNotFoundError(Exception):
"""Occurs when a type is not found, for example, """
when trying to read a TLObject with an invalid constructor code""" Occurs when a type is not found, for example,
when trying to read a TLObject with an invalid constructor code.
"""
def __init__(self, invalid_constructor_id): def __init__(self, invalid_constructor_id):
super().__init__( super().__init__(
self, 'Could not find a matching Constructor ID for the TLObject ' self, 'Could not find a matching Constructor ID for the TLObject '
@ -27,6 +30,10 @@ class TypeNotFoundError(Exception):
class InvalidChecksumError(Exception): class InvalidChecksumError(Exception):
"""
Occurs when using the TCP full mode and the checksum of a received
packet doesn't match the expected checksum.
"""
def __init__(self, checksum, valid_checksum): def __init__(self, checksum, valid_checksum):
super().__init__( super().__init__(
self, self,
@ -39,6 +46,9 @@ class InvalidChecksumError(Exception):
class BrokenAuthKeyError(Exception): class BrokenAuthKeyError(Exception):
"""
Occurs when the authorization key for a data center is not valid.
"""
def __init__(self): def __init__(self):
super().__init__( super().__init__(
self, self,
@ -47,6 +57,9 @@ class BrokenAuthKeyError(Exception):
class SecurityError(Exception): class SecurityError(Exception):
"""
Generic security error, mostly used when generating a new AuthKey.
"""
def __init__(self, *args): def __init__(self, *args):
if not args: if not args:
args = ['A security check failed.'] args = ['A security check failed.']
@ -54,6 +67,10 @@ class SecurityError(Exception):
class CdnFileTamperedError(SecurityError): class CdnFileTamperedError(SecurityError):
"""
Occurs when there's a hash mismatch between the decrypted CDN file
and its expected hash.
"""
def __init__(self): def __init__(self):
super().__init__( super().__init__(
'The CDN file has been altered and its download cancelled.' 'The CDN file has been altered and its download cancelled.'

View File

@ -1,4 +1,5 @@
class RPCError(Exception): class RPCError(Exception):
"""Base class for all Remote Procedure Call errors."""
code = None code = None
message = None message = None
@ -81,38 +82,42 @@ class ServerError(RPCError):
class BadMessageError(Exception): class BadMessageError(Exception):
"""Occurs when handling a bad_message_notification""" """Occurs when handling a bad_message_notification."""
ErrorMessages = { ErrorMessages = {
16: 16:
'msg_id too low (most likely, client time is wrong it would be worthwhile to ' 'msg_id too low (most likely, client time is wrong it would be '
'synchronize it using msg_id notifications and re-send the original message ' 'worthwhile to synchronize it using msg_id notifications and re-send '
'with the "correct" msg_id or wrap it in a container with a new msg_id if the ' 'the original message with the "correct" msg_id or wrap it in a '
'original message had waited too long on the client to be transmitted).', 'container with a new msg_id if the original message had waited too '
'long on the client to be transmitted).',
17: 17:
'msg_id too high (similar to the previous case, the client time has to be ' 'msg_id too high (similar to the previous case, the client time has '
'synchronized, and the message re-sent with the correct msg_id).', 'to be synchronized, and the message re-sent with the correct msg_id).',
18: 18:
'Incorrect two lower order msg_id bits (the server expects client message msg_id ' 'Incorrect two lower order msg_id bits (the server expects client '
'to be divisible by 4).', 'message msg_id to be divisible by 4).',
19: 19:
'Container msg_id is the same as msg_id of a previously received message ' 'Container msg_id is the same as msg_id of a previously received '
'(this must never happen).', 'message (this must never happen).',
20: 20:
'Message too old, and it cannot be verified whether the server has received a ' 'Message too old, and it cannot be verified whether the server has '
'message with this msg_id or not.', 'received a message with this msg_id or not.',
32: 32:
'msg_seqno too low (the server has already received a message with a lower ' 'msg_seqno too low (the server has already received a message with a '
'msg_id but with either a higher or an equal and odd seqno).', 'lower msg_id but with either a higher or an equal and odd seqno).',
33: 33:
'msg_seqno too high (similarly, there is a message with a higher msg_id but with ' 'msg_seqno too high (similarly, there is a message with a higher '
'either a lower or an equal and odd seqno).', 'msg_id but with either a lower or an equal and odd seqno).',
34: 34:
'An even msg_seqno expected (irrelevant message), but odd received.', 'An even msg_seqno expected (irrelevant message), but odd received.',
35: 'Odd msg_seqno expected (relevant message), but even received.', 35:
'Odd msg_seqno expected (relevant message), but even received.',
48: 48:
'Incorrect server salt (in this case, the bad_server_salt response is received with ' 'Incorrect server salt (in this case, the bad_server_salt response '
'the correct salt, and the message is to be re-sent with it).', 'is received with the correct salt, and the message is to be re-sent '
64: 'Invalid container.' 'with it).',
64:
'Invalid container.'
} }
def __init__(self, code): def __init__(self, code):