forked from tschellenbach/Django-facebook
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexceptions.py
More file actions
184 lines (130 loc) · 4.05 KB
/
Copy pathexceptions.py
File metadata and controls
184 lines (130 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
'''
Facebook error classes also see
http://fbdevwiki.com/wiki/Error_codes#User_Permission_Errors
'''
import ssl
try:
import urllib2
except ImportError:
import urllib.error as urllib2
class OpenFacebookException(Exception):
'''
BaseClass for all open facebook errors
'''
@classmethod
def codes_list(cls):
'''
Returns the codes as a list of instructions
'''
if hasattr(cls, 'codes'):
codes_list = [cls.codes]
if isinstance(cls.codes, list):
codes_list = cls.codes
return codes_list
@classmethod
def range(cls):
'''
Returns for how many codes this Exception, matches with the eventual
goal of matching an error to the most specific error class
'''
range = 0
codes_list = cls.codes_list()
for c in codes_list:
if isinstance(c, tuple):
start, stop = c
range += stop - start + 1
else:
range += 1
# make sure none specific exceptions are last in the order
if not range:
range = 1000
return range
class ParameterException(OpenFacebookException):
'''
100-189
190 and up are oauth errors
'''
codes = (100, 189)
class UnknownException(OpenFacebookException):
'''
Raised when facebook themselves don't know what went wrong
'''
codes = 1
class OAuthException(OpenFacebookException):
pass
class PermissionException(OAuthException):
'''
200-300
'''
codes = [3, (200, 299)]
class UserPermissionException(PermissionException):
codes = (300, 399)
class FeedActionLimit(UserPermissionException):
'''
When you posted too many times from one user acount
'''
codes = 341
class OpenGraphException(OpenFacebookException):
'''
Raised when we get error 3502, representing a problem with facebook
open graph data on the page
'''
codes = 3502
class DuplicateStatusMessage(OpenFacebookException):
codes = 506
class MissingParameter(OpenFacebookException):
pass
class AliasException(OpenFacebookException):
'''
When you send a request to a non existant url facebook gives this error
instead of a 404....
'''
codes = 803
class UnsupportedDeleteRequest(OpenFacebookException):
pass
class ParseException(OpenFacebookException):
'''
Anything preventing us from parsing the Facebook response
'''
pass
class FacebookUnreachable(OpenFacebookException):
'''
Timeouts, 500s, SSL errors etc
'''
pass
class FacebookSSLError(FacebookUnreachable, ssl.SSLError):
pass
class FacebookHTTPError(FacebookUnreachable, urllib2.HTTPError):
pass
class FacebookURLError(FacebookUnreachable, urllib2.URLError):
pass
def map_unreachable_exception(e):
'''
We always raise the original and new subclass to
- preserve backwards compatibility
'''
exception_class = FacebookUnreachable
if isinstance(e, ssl.SSLError):
exception_class = FacebookSSLError
elif isinstance(e, urllib2.HTTPError):
exception_class = FacebookHTTPError
elif isinstance(e, urllib2.URLError):
exception_class = FacebookURLError
return exception_class
def convert_unreachable_exception(e, error_format='Facebook is unreachable %s'):
'''
Converts an SSLError, HTTPError or URLError into something subclassing
FacebookUnreachable allowing code to easily try except this
'''
exception_class = map_unreachable_exception(e)
error_message = error_format % str(e)
exception = exception_class(error_message)
return exception
def get_exception_classes():
from open_facebook import exceptions as facebook_exceptions
all_exceptions = dir(facebook_exceptions)
classes = [getattr(facebook_exceptions, e, None) for e in all_exceptions]
exception_classes = [e for e in classes if getattr(
e, 'codes', None) and issubclass(
e, OpenFacebookException)]
return exception_classes