8000 Merge pull request #172 from methane/palaviv-msgpack-exceptions · sugarguo/msgpack-python@f895517 · GitHub
[go: up one dir, main page]

Skip to content

Commit f895517

Browse files
committed
Merge pull request msgpack#172 from methane/palaviv-msgpack-exceptions
Organize Exceptions
2 parents 82b3121 + b2a8ce6 commit f895517

File tree

5 files changed

+93
-74
lines changed

5 files changed

+93
-74
lines changed

msgpack/_packer.pyx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ from libc.stdlib cimport *
66
from libc.string cimport *
77
from libc.limits cimport *
88

9-
from msgpack.exceptions import PackValueError
9+
from msgpack.exceptions import PackValueError, PackOverflowError
1010
from msgpack import ExtType
1111

1212

@@ -166,7 +166,7 @@ cdef class Packer(object):
166166
default_used = True
167167
continue
168168
else:
169-
raise
169+
raise PackOverflowError("Integer value out of range")
170170
elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o):
171171
longval = o
172172
ret = msgpack_pack_long(&self.pk, longval)
@@ -180,7 +180,7 @@ cdef class Packer(object):
180180
elif PyBytes_CheckExact(o) if strict_types else PyBytes_Check(o):
181181
L = len(o)
182182
if L > (2**32)-1:
183-
raise ValueError("bytes is too large")
183+
raise PackValueError("bytes is too large")
184184
rawval = o
185185
ret = msgpack_pack_bin(&self.pk, L)
186186
if ret == 0:
@@ -191,7 +191,7 @@ cdef class Packer(object):
191191
o = PyUnicode_AsEncodedString(o, self.encoding, self.unicode_errors)
192192
L = len(o)
193193
if L > (2**32)-1:
194-
raise ValueError("unicode string is too large")
194+
raise PackValueError("unicode string is too large")
195195
rawval = o
196196
ret = msgpack_pack_raw(&self.pk, L)
197197
if ret == 0:
@@ -200,7 +200,7 @@ cdef class Packer(object):
200200
d = <dict>o
201201
L = len(d)
202202
if L > (2**32)-1:
203-
raise ValueError("dict is too large")
203+
raise PackValueError("dict is too large")
204204
ret = msgpack_pack_map(&self.pk, L)
205205
if ret == 0:
206206
for k, v in d.iteritems():
@@ -211,7 +211,7 @@ cdef class Packer(object):
211211
elif not strict_types and PyDict_Check(o):
212212
L = len(o)
213213
if L > (2**32)-1:
214-
raise ValueError("dict is too large")
214+
raise PackValueError("dict is too large")
215215
ret = msgpack_pack_map(&self.pk, L)
216216
if ret == 0:
217217
for k, v in o.items():
@@ -225,25 +225,25 @@ cdef class Packer(object):
225225
rawval = o.data
226226
L = len(o.data)
227227
if L > (2**32)-1:
228-
raise ValueError("EXT data is too large")
228+
raise PackValueError("EXT data is too large")
229229
ret = msgpack_pack_ext(&self.pk, longval, L)
230230
ret = msgpack_pack_raw_body(&self.pk, rawval, L)
231231
elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)):
232232
L = len(o)
233233
if L > (2**32)-1:
234-
raise ValueError("list is too large")
234+
raise PackValueError("list is too large")
235235
ret = msgpack_pack_array(&self.pk, L)
236236
if ret == 0:
237237
for v in o:
238238
ret = self._pack(v, nest_limit-1)
239239
if ret != 0: break
240240
elif PyMemoryView_Check(o):
241241
if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0:
242-
raise ValueError("could not get buffer for memoryview")
242+
raise PackValueError("could not get buffer for memoryview")
243243
L = view.len
244244
if L > (2**32)-1:
245245
PyBuffer_Release(&view);
246-
raise ValueError("memoryview is too large")
246+
raise PackValueError("memoryview is too large")
247247
ret = msgpack_pack_bin(&self.pk, L)
248248
if ret == 0:
249249
ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L)
@@ -274,7 +274,7 @@ cdef class Packer(object):
274274

275275
def pack_array_header(self, size_t size):
276276
if size > (2**32-1):
277-
raise ValueError
277+
raise PackValueError
278278
cdef int ret = msgpack_pack_array(&self.pk, size)
279279
if ret == -1:
280280
raise MemoryError
@@ -287,7 +287,7 @@ cdef class Packer(object):
287287

288288
def pack_map_header(self, size_t size):
289289
if size > (2**32-1):
290-
raise ValueError
290+
raise PackValueError
291291
cdef int ret = msgpack_pack_map(&self.pk, size)
292292
if ret == -1:
293293
raise MemoryError

msgpack/_unpacker.pyx

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ from libc.string cimport *
1111
from libc.limits cimport *
1212

1313
from msgpack.exceptions import (
14-
BufferFull,
15-
OutOfData,
16-
UnpackValueError,
17-
ExtraData,
18-
)
14+
BufferFull,
15+
OutOfData,
16+
UnpackValueError,
17+
ExtraData,
18+
)
1919
from msgpack import ExtType
2020

2121

@@ -397,24 +397,27 @@ cdef class Unpacker(object):
397397
else:
398398
raise OutOfData("No more data to unpack.")
399399

400-
ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head)
401-
if write_bytes is not None:
402-
write_bytes(PyBytes_FromStringAndSize(self.buf + prev_head, self.buf_head - prev_head))
403-
404-
if ret == 1:
405-
obj = unpack_data(&self.ctx)
406-
unpack_init(&self.ctx)
407-
return obj
408-
elif ret == 0:
409-
if self.file_like is not None:
410-
self.read_from_file()
411-
continue
412-
if iter:
413-
raise StopIteration("No more data to unpack.")
400+
try:
401+
ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head)
402+
if write_bytes is not None:
403+
write_bytes(PyBytes_FromStringAndSize(self.buf + prev_head, self.buf_head - prev_head))
404+
405+
if ret == 1:
406+
obj = unpack_data(&self.ctx)
407+
unpack_init(&self.ctx)
408+
return obj
409+
elif ret == 0:
410+
if self.file_like is not None:
411+
self.read_from_file()
412+
continue
413+
if iter:
414+
raise StopIteration("No more data to unpack.")
415+
else:
416+
raise OutOfData("No more data to unpack.")
414417
else:
415-
raise OutOfData("No more data to unpack.")
416-
else:
417-
raise ValueError("Unpack failed: error = %d" % (ret,))
418+
raise UnpackValueError("Unpack failed: error = %d" % (ret,))
419+
except ValueError as e:
420+
raise UnpackValueError(e)
418421

419422
def read_bytes(self, Py_ssize_t nbytes):
420423
"""Read a specified number of raw bytes from the stream"""

msgpack/exceptions.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class UnpackException(Exception):
2-
pass
2+
"""Deprecated. Use Exception instead to catch all exception during unpacking."""
33

44

55
class BufferFull(UnpackException):
@@ -11,19 +11,31 @@ class OutOfData(UnpackException):
1111

1212

1313
class UnpackValueError(UnpackException, ValueError):
14-
pass
14+
"""Deprecated. Use ValueError instead."""
1515

1616

17-
class ExtraData(ValueError):
17+
class ExtraData(UnpackValueError):
1818
def __init__(self, unpacked, extra):
1919
self.unpacked = unpacked
2020
self.extra = extra
2121

2222
def __str__(self):
2323
return "unpack(b) received extra data."
2424

25+
2526
class PackException(Exception):
26-
pass
27+
"""Deprecated. Use Exception instead to catch all exception during packing."""
28+
2729

2830
class PackValueError(PackException, ValueError):
29-
pass
31+
"""PackValueError is raised when type of input data is supported but it's value is unsupported.
32+
33+
Deprecated. Use ValueError instead.
34+
"""
35+
36+
37+
class PackOverflowError(PackValueError, OverflowError):
38+
"""PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32).
39+
40+
Deprecated. Use ValueError instead.
41+
"""

msgpack/fallback.py

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def getvalue(self):
5151
OutOfData,
5252
UnpackValueError,
5353
PackValueError,
54+
PackOverflowError,
5455
ExtraData)
5556

5657
from msgpack import ExtType
@@ -363,17 +364,17 @@ def _read_header(self, execute=EX_CONSTRUCT, write_bytes=None):
363364
obj = self._fb_read(n, write_bytes)
364365
typ = TYPE_RAW
365366
if n > self._max_str_len:
366-
raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
367+
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
367368
elif b & 0b11110000 == 0b10010000:
368369
n = b & 0b00001111
369370
typ = TYPE_ARRAY
370371
if n > self._max_array_len:
371-
raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
372+
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
372373
elif b & 0b11110000 == 0b10000000:
373374
n = b & 0b00001111
374375
typ = TYPE_MAP
375376
if n > self._max_map_len:
376-
raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
377+
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
377378
elif b == 0xc0:
378379
obj = None
379380
elif b == 0xc2:
@@ -384,37 +385,37 @@ def _read_header(self, execute=EX_CONSTRUCT, write_bytes=None):
384385
typ = TYPE_BIN
385386
n = struct.unpack("B", self._fb_read(1, write_bytes))[0]
386387
if n > self._max_bin_len:
387-
raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
388+
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
388389
obj = self._fb_read(n, write_bytes)
389390
elif b == 0xc5:
390391
typ = TYPE_BIN
391392
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
392393
if n > self._max_bin_len:
393-
raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
394+
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
394395
obj = self._fb_read(n, write_bytes)
395396
elif b == 0xc6:
396397
typ = TYPE_BIN
397398
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
398399
if n > self._max_bin_len:
399-
raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
400+
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
400401
obj = self._fb_read(n, write_bytes)
401402
elif b == 0xc7: # ext 8
402403
typ = TYPE_EXT
403404
L, n = struct.unpack('Bb', self._fb_read(2, write_bytes))
404405
if L > self._max_ext_len:
405-
raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
406+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
406407
obj = self._fb_read(L, write_bytes)
407408
elif b == 0xc8: # ext 16
408409
typ = TYPE_EXT
409410
L, n = struct.unpack('>Hb', self._fb_read(3, write_bytes))
410411
if L > self._max_ext_len:
411-
raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
412+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
412413
obj = self._fb_read(L, write_bytes)
413414
elif b == 0xc9: # ext 32
414415
typ = TYPE_EXT
415416
L, n = struct.unpack('>Ib', self._fb_read(5, write_bytes))
416417
if L > self._max_ext_len:
417-
raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
418+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
418419
obj = self._fb_read(L, write_bytes)
419420
elif b == 0xca:
420421
obj = struct.unpack(">f", self._fb_read(4, write_bytes))[0]
@@ -439,65 +440,65 @@ def _read_header(self, execute=EX_CONSTRUCT, write_bytes=None):
439440
elif b == 0xd4: # fixext 1
440441
typ = TYPE_EXT
441442
if self._max_ext_len < 1:
442-
raise ValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
443+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
443444
n, obj = struct.unpack('b1s', self._fb_read(2, write_bytes))
444445
elif b == 0xd5: # fixext 2
445446
typ = TYPE_EXT
446447
if self._max_ext_len < 2:
447-
raise ValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
448+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
448449
n, obj = struct.unpack('b2s', self._fb_read(3, write_bytes))
449450
elif b == 0xd6: # fixext 4
450451
typ = TYPE_EXT
451452
if self._max_ext_len < 4:
452-
raise ValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
453+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
453454
n, obj = struct.unpack('b4s', self._fb_read(5, write_bytes))
454455
elif b == 0xd7: # fixext 8
455456
typ = TYPE_EXT
456457
if self._max_ext_len < 8:
457-
raise ValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
458+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
458459
n, obj = struct.unpack('b8s', self._fb_read(9, write_bytes))
459460
elif b == 0xd8: # fixext 16
460461
typ = TYPE_EXT
461462
if self._max_ext_len < 16:
462-
raise ValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
463+
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
463464
n, obj = struct.unpack('b16s', self._fb_read(17, write_bytes))
464465
elif b == 0xd9:
465466
typ = TYPE_RAW
466467
n = struct.unpack("B", self._fb_read(1, write_bytes))[0]
467468
if n > self._max_str_len:
468-
raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
469+
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
469470
obj = self._fb_read(n, write_bytes)
470471
elif b == 0xda:
471472
typ = TYPE_RAW
472473
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
473474
if n > self._max_str_len:
474-
raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
475+
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
475476
obj = self._fb_read(n, write_bytes)
476477
elif b == 0xdb:
477478
typ = TYPE_RAW
478479
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
479480
if n > self._max_str_len:
480-
raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
481+
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
481482
obj = self._fb_read(n, write_bytes)
482483
elif b == 0xdc:
483484
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
484485
if n > self._max_array_len:
485-
raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
486+
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
486487
typ = TYPE_ARRAY
487488
elif b == 0xdd:
488489
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
489490
if n > self._max_array_len:
490-
raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
491+
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
491492
typ = TYPE_ARRAY
492493
elif b == 0xde:
493494
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
494495
if n > self._max_map_len:
495-
raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
496+
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
496497
typ = TYPE_MAP
497498
elif b == 0xdf:
498499
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
499500
if n > self._max_map_len:
500-
raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
501+
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
501502
typ = TYPE_MAP
502503
else:
503504
raise UnpackValueError("Unknown header: 0x%x" % b)
@@ -683,7 +684,7 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT,
683684
obj = self._default(obj)
684685
default_used = True
685686
continue
686-
raise PackValueError("Integer value out of range")
687+
raise PackOverflowError("Integer value out of range")
687688
if self._use_bin_type and check(obj, (bytes, memoryview)):
688689
n = len(obj)
689690
if n <= 0xff:
@@ -778,7 +779,7 @@ def pack_map_pairs(self, pairs):
778779

779780
def pack_array_header(self, n):
780781
if n >= 2**32:
781-
raise ValueError
782+
raise PackValueError
782783
self._fb_pack_array_header(n)
783784
ret = self._buffer.getvalue()
784785
if self._autoreset:
@@ -789,7 +790,7 @@ def pack_array_header(self, n):
789790

790791
def pack_map_header(self, n):
791792
if n >= 2**32:
792-
raise ValueError
793+
raise PackValueError
793794
self._fb_pack_map_header(n)
794795
ret = self._buffer.getvalue()
795796
if self._autoreset:
@@ -807,7 +808,7 @@ def pack_ext_type(self, typecode, data):
807808
raise TypeError("data must have bytes type")
808809
L = len(data)
809810
if L > 0xffffffff:
810-
raise ValueError("Too large data")
811+
raise PackValueError("Too large data")
811812
if L == 1:
812813
self._buffer.write(b'\xd4')
813814
elif L == 2:

0 commit comments

Comments
 (0)
0