抛出BufferError的示例

时间:2013-12-01 01:29:37

标签: python python-3.x

在阅读Python 3.3文档时,我注意到有关BufferError异常的条目:“当无法执行与缓冲区相关的操作时引发”。现在我想知道在哪些情况下代码可以抛出此错误以确定它是由于编程错误还是更像是一种系统错误。有人为这个例外做了一个例子吗?

2 个答案:

答案 0 :(得分:0)

以下是可能引发BufferError的函数列表:

http://docs.python.org/3.4/c-api/buffer.html#buffer-related-functions

答案 1 :(得分:0)

大多数异常实际上比使用缓冲协议的Python代码更适用于C代码;请参阅C API buffer protocol

从3.3源代码中,我看到BufferError使用了以下错误消息:

memoryview

    对于只读缓冲区,
  • 底层缓冲区不可写
  • 为非连续对象请求的可写连续缓冲区。用于未使用正确连续格式的内存视图
  • memoryview在发布时有%zd导出的缓冲区%s ;这将是IIRC,表明引用计数关闭。
  • memoryview:从只读缓冲区创建可写memoryview时,底层缓冲区不可写。不应该从Python代码中发生。
  • memoryview:传入非连续缓冲区对象但标记请求的缓冲区对象时,底层缓冲区不是C连续的。如果使用了strides且缓冲区不是C-contiguous,则也会抛出此异常。
  • memoryview:底层缓冲区不是Fortran连续的,同上。
  • memoryview:底层缓冲区不连续,同上。
  • memoryview:底层缓冲区需要子偏移:flags表示需要一个子偏移缓冲区,但传递的缓冲区不是。
  • memoryview:如果格式标志存在,则无法转换为无符号字节:无符号字节和指定格式不混合。

bytearray

  • 现有的数据导出:无法重新调整对象:尝试调整其上包含其他视图的bytearray

还有一个未记录的PyObject_CopyData C-API方法,如果目标缓冲区太小,那么目标的抛出此异常太小,无法从源接收数据。