Xử lý ngoại lệ

Các hàm được mô tả trong chương này sẽ cho phép bạn xử lý và đưa ra các ngoại lệ trong Python. Điều quan trọng là phải hiểu một số điều cơ bản về xử lý ngoại lệ trong Python. Nó hoạt động hơi giống biến POSIX errno: có một chỉ báo chung (mỗi luồng) về lỗi xảy ra gần đây nhất. Hầu hết các hàm C API không xóa điều này khi thành công nhưng sẽ đặt nó để chỉ ra nguyên nhân gây ra lỗi khi thất bại. Hầu hết các hàm C API cũng trả về một chỉ báo lỗi, thường là NULL nếu chúng phải trả về một con trỏ hoặc -1 nếu chúng trả về một số nguyên (ngoại trừ: các hàm PyArg_* trả về 1 nếu thành công và 0 nếu thất bại).

Cụ thể, chỉ báo lỗi bao gồm ba con trỏ đối tượng: loại ngoại lệ, giá trị ngoại lệ và đối tượng truy nguyên. Bất kỳ con trỏ nào trong số đó đều có thể là NULL nếu không được đặt (mặc dù một số kết hợp bị cấm, ví dụ: bạn không thể có truy nguyên không phải NULL nếu loại ngoại lệ là NULL).

Khi một chức năng phải bị lỗi do một số chức năng mà nó gọi là bị lỗi, thông thường nó không đặt chỉ báo lỗi; chức năng mà nó gọi đã được thiết lập rồi. Nó chịu trách nhiệm xử lý lỗi và xóa ngoại lệ hoặc quay lại sau khi dọn sạch mọi tài nguyên mà nó giữ (chẳng hạn như tham chiếu đối tượng hoặc phân bổ bộ nhớ); not sẽ tiếp tục hoạt động bình thường nếu nó chưa được chuẩn bị để xử lý lỗi. Nếu quay lại do lỗi, điều quan trọng là phải cho người gọi biết rằng lỗi đã được đặt. Nếu lỗi không được xử lý hoặc thông báo cẩn thận, các lệnh gọi bổ sung vào Python/C API có thể không hoạt động như dự định và có thể thất bại theo những cách bí ẩn.

Ghi chú

Chỉ báo lỗi là not là kết quả của sys.exc_info(). Cái trước tương ứng với một ngoại lệ chưa bị bắt (và do đó vẫn đang lan truyền), trong khi cái sau trả về một ngoại lệ sau khi nó bị bắt (và do đó đã ngừng lan truyền).

In và xóa

void PyErr_Clear()
Một phần của ABI ổn định.

Xóa chỉ báo lỗi. Nếu chỉ báo lỗi không được đặt thì sẽ không có hiệu lực.

void PyErr_PrintEx(int set_sys_last_vars)
Một phần của ABI ổn định.

In truy nguyên tiêu chuẩn tới sys.stderr và xóa chỉ báo lỗi. Unless lỗi là SystemExit, trong trường hợp đó không có dấu vết nào được in và quy trình Python sẽ thoát với mã lỗi được chỉ định bởi phiên bản SystemExit.

Gọi hàm này only khi chỉ báo lỗi được đặt. Nếu không nó sẽ gây ra lỗi nghiêm trọng!

Nếu set_sys_last_vars khác 0, biến sys.last_exc được đặt thành ngoại lệ được in. Để tương thích ngược, các biến không dùng nữa sys.last_type, sys.last_valuesys.last_traceback cũng được đặt tương ứng thành loại, giá trị và truy nguyên của ngoại lệ này.

Thay đổi trong phiên bản 3.12: Cài đặt sys.last_exc đã được thêm vào.

void PyErr_Print()
Một phần của ABI ổn định.

Bí danh cho PyErr_PrintEx(1).

void PyErr_WriteUnraisable(PyObject *obj)
Một phần của ABI ổn định.

Gọi sys.unraisablehook() bằng ngoại lệ hiện tại và đối số obj.

Hàm tiện ích này in một thông báo cảnh báo tới sys.stderr khi một ngoại lệ đã được đặt nhưng trình thông dịch không thể thực sự đưa ra ngoại lệ đó. Ví dụ, nó được sử dụng khi một ngoại lệ xảy ra trong phương thức __del__().

Hàm được gọi với một đối số duy nhất obj xác định bối cảnh xảy ra ngoại lệ không thể xử lý được. Nếu có thể, bản repr của obj sẽ được in trong thông báo cảnh báo. Nếu objNULL thì chỉ có dấu vết được in.

Một ngoại lệ phải được đặt khi gọi hàm này.

Thay đổi trong phiên bản 3.4: In một dấu vết. Chỉ in truy nguyên nếu objNULL.

Thay đổi trong phiên bản 3.8: Sử dụng sys.unraisablehook().

void PyErr_FormatUnraisable(const char *format, ...)

Tương tự như PyErr_WriteUnraisable(), nhưng format và các tham số tiếp theo giúp định dạng thông báo cảnh báo; chúng có cùng ý nghĩa và giá trị như trong PyUnicode_FromFormat(). PyErr_WriteUnraisable(obj) gần tương đương với PyErr_FormatUnraisable("Exception ignored in: %R", obj). Nếu formatNULL thì chỉ có dấu vết được in.

Added in version 3.13.

void PyErr_DisplayException(PyObject *exc)
Một phần của ABI ổn định kể từ phiên bản 3.12.

In màn hình truy nguyên tiêu chuẩn của exc đến sys.stderr, bao gồm các ngoại lệ và ghi chú theo chuỗi.

Added in version 3.12.

Đưa ra ngoại lệ

Các chức năng này giúp bạn đặt chỉ báo lỗi của luồng hiện tại. Để thuận tiện, một số hàm này sẽ luôn trả về một con trỏ NULL để sử dụng trong câu lệnh return.

void PyErr_SetString(PyObject *type, const char *message)
Một phần của ABI ổn định.

Đây là cách phổ biến nhất để đặt chỉ báo lỗi. Đối số đầu tiên chỉ định loại ngoại lệ; nó thường là một trong những trường hợp ngoại lệ tiêu chuẩn, ví dụ: PyExc_RuntimeError. Bạn không cần phải tạo strong reference mới cho nó (ví dụ: với Py_INCREF()). Đối số thứ hai là một thông báo lỗi; nó được giải mã từ 'utf-8'.

void PyErr_SetObject(PyObject *type, PyObject *value)
Một phần của ABI ổn định.

Hàm này tương tự như PyErr_SetString() nhưng cho phép bạn chỉ định một đối tượng Python tùy ý cho "giá trị" của ngoại lệ.

PyObject *PyErr_Format(PyObject *exception, const char *format, ...)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định.

Hàm này đặt chỉ báo lỗi và trả về NULL. exception phải là một lớp ngoại lệ Python. format và các tham số tiếp theo giúp định dạng thông báo lỗi; chúng có cùng ý nghĩa và giá trị như trong PyUnicode_FromFormat(). format là chuỗi được mã hóa ASCII.

PyObject *PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định kể từ phiên bản 3.5.

Tương tự như PyErr_Format(), nhưng lấy đối số va_list thay vì số lượng đối số thay đổi.

Added in version 3.5.

void PyErr_SetNone(PyObject *type)
Một phần của ABI ổn định.

Đây là cách viết tắt của PyErr_SetObject(type, Py_None).

int PyErr_BadArgument()
Một phần của ABI ổn định.

Đây là cách viết tắt của PyErr_SetString(PyExc_TypeError, message), trong đó message chỉ ra rằng một thao tác tích hợp đã được gọi với một đối số bất hợp pháp. Nó chủ yếu được sử dụng nội bộ.

PyObject *PyErr_NoMemory()
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định.

Đây là cách viết tắt của PyErr_SetNone(PyExc_MemoryError); nó trả về NULL để hàm cấp phát đối tượng có thể ghi return PyErr_NoMemory(); khi hết bộ nhớ.

PyObject *PyErr_SetFromErrno(PyObject *type)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định.

Đây là một hàm tiện lợi để đưa ra một ngoại lệ khi hàm thư viện C trả về lỗi và đặt biến C errno. Nó xây dựng một đối tượng tuple có mục đầu tiên là giá trị số nguyên errno và mục thứ hai là thông báo lỗi tương ứng (nhận được từ strerror()), sau đó gọi PyErr_SetObject(type, object). Trên Unix, khi giá trị errnoEINTR, biểu thị lệnh gọi hệ thống bị gián đoạn, lệnh gọi này sẽ gọi PyErr_CheckSignals() và nếu điều đó đặt chỉ báo lỗi, nó sẽ được đặt thành giá trị đó. Hàm này luôn trả về NULL, do đó, hàm bao bọc xung quanh lệnh gọi hệ thống có thể ghi return PyErr_SetFromErrno(type); khi lệnh gọi hệ thống trả về lỗi.

PyObject *PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định.

Tương tự như PyErr_SetFromErrno(), với hành vi bổ sung là nếu filenameObject không phải là NULL thì nó sẽ được chuyển đến hàm tạo của type làm tham số thứ ba. Trong trường hợp ngoại lệ OSError, thuộc tính này được sử dụng để xác định thuộc tính filename của phiên bản ngoại lệ.

PyObject *PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định kể từ phiên bản 3.7.

Tương tự như PyErr_SetFromErrnoWithFilenameObject(), nhưng lấy đối tượng tên tệp thứ hai, để phát sinh lỗi khi một hàm lấy hai tên tệp bị lỗi.

Added in version 3.4.

PyObject *PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định.

Tương tự như PyErr_SetFromErrnoWithFilenameObject(), nhưng tên tệp được đặt dưới dạng chuỗi C. filename được giải mã từ filesystem encoding and error handler.

PyObject *PyErr_SetFromWindowsErr(int ierr)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

Đây là một chức năng tiện lợi để nâng cao OSError. Nếu được gọi bằng ierr của 0, mã lỗi được trả về bởi lệnh gọi tới GetLastError() sẽ được sử dụng thay thế. Nó gọi hàm Win32 FormatMessage() để truy xuất mô tả mã lỗi của Windows do ierr hoặc GetLastError() cung cấp, sau đó nó xây dựng một đối tượng OSError với thuộc tính winerror được đặt thành mã lỗi, thuộc tính strerror được đặt thành thông báo lỗi tương ứng (lấy từ FormatMessage()), rồi gọi PyErr_SetObject(PyExc_OSError, object). Hàm này luôn trả về NULL.

sẵn có: Windows.

PyObject *PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

Tương tự như PyErr_SetFromWindowsErr(), với một tham số bổ sung chỉ định loại ngoại lệ sẽ được đưa ra.

sẵn có: Windows.

PyObject *PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

Tương tự như PyErr_SetFromWindowsErr(), với hành vi bổ sung là nếu filename không phải là NULL thì nó sẽ được giải mã từ mã hóa hệ thống tệp (os.fsdecode()) và được chuyển đến hàm tạo của OSError làm tham số thứ ba được sử dụng để xác định thuộc tính filename của phiên bản ngoại lệ.

sẵn có: Windows.

PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

Tương tự như PyErr_SetExcFromWindowsErr(), với hành vi bổ sung là nếu filename không phải là NULL thì nó sẽ được chuyển đến hàm tạo của OSError dưới dạng tham số thứ ba được sử dụng để xác định thuộc tính filename của phiên bản ngoại lệ.

sẵn có: Windows.

PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

Tương tự như PyErr_SetExcFromWindowsErrWithFilenameObject(), nhưng chấp nhận đối tượng tên tệp thứ hai.

sẵn có: Windows.

Added in version 3.4.

PyObject *PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

Tương tự như PyErr_SetFromWindowsErrWithFilename(), với một tham số bổ sung chỉ định loại ngoại lệ sẽ được đưa ra.

sẵn có: Windows.

PyObject *PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định kể từ phiên bản 3.7.

Đây là một chức năng tiện lợi để nâng cao ImportError. msg sẽ được đặt làm chuỗi thông báo của ngoại lệ. namepath, cả hai đều có thể là NULL, sẽ được đặt làm thuộc tính namepath tương ứng của ImportError.

Added in version 3.3.

PyObject *PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)
Giá trị trả về: Luôn NULL. Một phần của ABI ổn định kể từ phiên bản 3.6.

Giống như PyErr_SetImportError() nhưng chức năng này cho phép chỉ định một lớp con của ImportError để nâng cao.

Added in version 3.6.

void PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)

Đặt thông tin tệp, dòng và offset cho ngoại lệ hiện tại. Nếu ngoại lệ hiện tại không phải là SyntaxError thì nó sẽ đặt các thuộc tính bổ sung, khiến hệ thống con in ngoại lệ cho rằng ngoại lệ đó là SyntaxError.

Added in version 3.4.

void PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset, int end_lineno, int end_col_offset)

Tương tự như PyErr_SyntaxLocationObject(), nhưng cũng đặt thông tin end_linenoend_col_offset cho ngoại lệ hiện tại.

Added in version 3.10.

void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
Một phần của ABI ổn định kể từ phiên bản 3.7.

Giống như PyErr_SyntaxLocationObject(), nhưng filename là một chuỗi byte được giải mã từ filesystem encoding and error handler.

Added in version 3.2.

void PyErr_SyntaxLocation(const char *filename, int lineno)
Một phần của ABI ổn định.

Giống như PyErr_SyntaxLocationEx() nhưng tham số col_offset bị bỏ qua.

void PyErr_BadInternalCall()
Một phần của ABI ổn định.

Đây là cách viết tắt của PyErr_SetString(PyExc_SystemError, message), trong đó message chỉ ra rằng một hoạt động nội bộ (ví dụ: hàm API của Python/C) đã được gọi với một đối số không hợp lệ. Nó chủ yếu được sử dụng nội bộ.

PyObject *PyErr_ProgramTextObject(PyObject *filename, int lineno)

Lấy dòng nguồn trong filename tại dòng lineno. filename phải là đối tượng str của Python.

Nếu thành công, hàm này trả về một đối tượng chuỗi Python có dòng tìm thấy. Nếu thất bại, hàm này trả về NULL mà không đặt ngoại lệ.

PyObject *PyErr_ProgramText(const char *filename, int lineno)
Một phần của ABI ổn định.

Tương tự như PyErr_ProgramTextObject(), nhưng filenameconst char*, được giải mã bằng filesystem encoding and error handler, thay vì tham chiếu đối tượng Python.

Đưa ra cảnh báo

Sử dụng các hàm này để đưa ra cảnh báo từ mã C. Chúng phản chiếu các hàm tương tự được xuất bởi mô-đun warnings của Python. Họ thường in một thông báo cảnh báo tới sys.stderr; tuy nhiên, cũng có thể người dùng đã chỉ định rằng các cảnh báo sẽ bị biến thành lỗi và trong trường hợp đó họ sẽ đưa ra một ngoại lệ. Cũng có thể các chức năng đưa ra một ngoại lệ do có vấn đề với bộ máy cảnh báo. Giá trị trả về là 0 nếu không có ngoại lệ nào được đưa ra hoặc -1 nếu có ngoại lệ được nêu ra. (Không thể xác định xem thông báo cảnh báo có thực sự được in hay không cũng như lý do ngoại lệ là gì; đây là cố ý.) Nếu một ngoại lệ được đưa ra, thì lệnh gọi sẽ thực hiện xử lý ngoại lệ thông thường (ví dụ: các tham chiếu thuộc sở hữu của Py_DECREF() và trả về một giá trị lỗi).

int PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
Một phần của ABI ổn định.

Đưa ra thông báo cảnh báo. Đối số category là một danh mục cảnh báo (xem bên dưới) hoặc NULL; đối số message là chuỗi được mã hóa UTF-8. stack_level là số dương biểu thị số lượng khung xếp chồng; cảnh báo sẽ được đưa ra từ dòng mã hiện đang thực thi trong khung ngăn xếp đó. stack_level bằng 1 là hàm gọi PyErr_WarnEx(), 2 là hàm ở trên đó, v.v.

Các danh mục cảnh báo phải là lớp con của PyExc_Warning; PyExc_Warning là lớp con của PyExc_Exception; danh mục cảnh báo mặc định là PyExc_RuntimeWarning. Các danh mục cảnh báo Python tiêu chuẩn có sẵn dưới dạng các biến toàn cục có tên được liệt kê tại Các loại cảnh báo.

Để biết thông tin về kiểm soát cảnh báo, hãy xem tài liệu dành cho mô-đun warnings và tùy chọn -W trong tài liệu dòng lệnh. Không có C API để kiểm soát cảnh báo.

int PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)

Đưa ra thông báo cảnh báo với sự kiểm soát rõ ràng đối với tất cả các thuộc tính cảnh báo. Đây là một trình bao bọc đơn giản xung quanh hàm Python warnings.warn_explicit(); xem ở đó để biết thêm thông tin. Các đối số moduleregistry có thể được đặt thành NULL để có được hiệu ứng mặc định được mô tả ở đó.

Added in version 3.4.

int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)
Một phần của ABI ổn định.

Tương tự như PyErr_WarnExplicitObject() ngoại trừ messagemodule là các chuỗi được mã hóa UTF-8 và filename được giải mã từ filesystem encoding and error handler.

int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...)
Một phần của ABI ổn định.

Chức năng tương tự như PyErr_WarnEx() nhưng sử dụng PyUnicode_FromFormat() để định dạng thông báo cảnh báo. format là chuỗi được mã hóa ASCII.

Added in version 3.2.

int PyErr_WarnExplicitFormat(PyObject *category, const char *filename, int lineno, const char *module, PyObject *registry, const char *format, ...)

Tương tự như PyErr_WarnExplicit() nhưng sử dụng PyUnicode_FromFormat() để định dạng thông báo cảnh báo. format là chuỗi được mã hóa ASCII.

Added in version 3.2.

int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...)
Một phần của ABI ổn định kể từ phiên bản 3.6.

Chức năng tương tự như PyErr_WarnFormat(), nhưng categoryResourceWarning và nó chuyển source sang warnings.WarningMessage.

Added in version 3.6.

Truy vấn chỉ báo lỗi

PyObject *PyErr_Occurred()
Giá trị trả về: Tham chiếu mượn. Một phần của ABI ổn định.

Kiểm tra xem chỉ báo lỗi có được đặt hay không. Nếu được đặt, hãy trả về ngoại lệ type (đối số đầu tiên cho lệnh gọi cuối cùng tới một trong các hàm PyErr_Set* hoặc tới PyErr_Restore()). Nếu không được đặt, hãy trả về NULL. Bạn không sở hữu một tham chiếu đến giá trị trả về nên bạn không cần phải Py_DECREF() nó.

Người gọi phải có attached thread state.

Ghi chú

Không so sánh giá trị trả về với một ngoại lệ cụ thể; thay vào đó hãy sử dụng PyErr_ExceptionMatches(), được hiển thị bên dưới. (Việc so sánh có thể dễ dàng thất bại vì ngoại lệ có thể là một thể hiện thay vì một lớp, trong trường hợp ngoại lệ lớp hoặc nó có thể là một lớp con của ngoại lệ dự kiến.)

int PyErr_ExceptionMatches(PyObject *exc)
Một phần của ABI ổn định.

Tương đương với PyErr_GivenExceptionMatches(PyErr_Occurred(), exc). Điều này chỉ nên được gọi khi một ngoại lệ thực sự được đặt; vi phạm quyền truy cập bộ nhớ sẽ xảy ra nếu không có ngoại lệ nào được đưa ra.

int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
Một phần của ABI ổn định.

Trả về true nếu ngoại lệ given khớp với loại ngoại lệ trong exc. Nếu exc là một đối tượng lớp, điều này cũng trả về true khi given là một thể hiện của lớp con. Nếu exc là một bộ dữ liệu, tất cả các loại ngoại lệ trong bộ dữ liệu (và đệ quy trong các bộ dữ liệu phụ) sẽ được tìm kiếm để tìm kết quả khớp.

PyObject *PyErr_GetRaisedException(void)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định kể từ phiên bản 3.12.

Trả về ngoại lệ hiện đang được nêu ra, đồng thời xóa chỉ báo lỗi. Trả về NULL nếu chỉ báo lỗi không được đặt.

Chức năng này được sử dụng bởi mã cần bắt ngoại lệ hoặc mã cần lưu và khôi phục tạm thời chỉ báo lỗi.

Ví dụ:

{
   PyObject *exc = PyErr_GetRaisedException();

   /* ... đoạn mã có thể tạo ra các lỗi khác ... */

   PyErr_SetRaisedException(exc);
}

Xem thêm

PyErr_GetHandledException(), để lưu ngoại lệ hiện đang được xử lý.

Added in version 3.12.

void PyErr_SetRaisedException(PyObject *exc)
Một phần của ABI ổn định kể từ phiên bản 3.12.

Đặt exc làm ngoại lệ hiện đang được nêu ra, xóa ngoại lệ hiện có nếu ngoại lệ được đặt.

Cảnh báo

Cuộc gọi này đánh cắp một tham chiếu đến exc, đây phải là một ngoại lệ hợp lệ.

Added in version 3.12.

void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
Một phần của ABI ổn định.

Sắp loại bỏ từ phiên bản 3.12: Thay vào đó hãy sử dụng PyErr_GetRaisedException().

Truy xuất chỉ báo lỗi thành ba biến có địa chỉ được truyền. Nếu chỉ báo lỗi không được đặt, hãy đặt cả ba biến thành NULL. Nếu được đặt, nó sẽ bị xóa và bạn sở hữu một tham chiếu đến từng đối tượng được truy xuất. Đối tượng giá trị và truy nguyên có thể là NULL ngay cả khi đối tượng loại không phải như vậy.

Ghi chú

Chức năng này thường chỉ được sử dụng bởi mã kế thừa cần bắt ngoại lệ hoặc lưu và khôi phục tạm thời chỉ báo lỗi.

Ví dụ:

{
   PyObject *type, *value, *truy ngược lại;
   PyErr_Fetch(&type, &value, &traceback);

   /* ... đoạn mã có thể tạo ra các lỗi khác ... */

   PyErr_Restore(loại, giá trị, truy nguyên);
}
void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Một phần của ABI ổn định.

Sắp loại bỏ từ phiên bản 3.12: Thay vào đó hãy sử dụng PyErr_SetRaisedException().

Đặt chỉ báo lỗi từ ba đối tượng, type, valuetraceback, xóa ngoại lệ hiện có nếu một đối tượng được đặt. Nếu các đối tượng là NULL, chỉ báo lỗi sẽ bị xóa. Không chuyển loại NULL và giá trị không phải NULL hoặc truy nguyên. Loại ngoại lệ phải là một lớp. Không chuyển loại hoặc giá trị ngoại lệ không hợp lệ. (Vi phạm các quy tắc này sẽ gây ra các vấn đề nhỏ sau này.) Lệnh gọi này sẽ lấy đi một tham chiếu đến từng đối tượng: bạn phải sở hữu một tham chiếu đến từng đối tượng trước cuộc gọi và sau cuộc gọi, bạn không còn sở hữu các tham chiếu này nữa. (Nếu bạn không hiểu điều này thì đừng sử dụng chức năng này. Tôi đã cảnh báo bạn.)

Ghi chú

Chức năng này thường chỉ được sử dụng bởi mã kế thừa cần lưu và khôi phục tạm thời chỉ báo lỗi. Sử dụng PyErr_Fetch() để lưu chỉ báo lỗi hiện tại.

void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Một phần của ABI ổn định.

Sắp loại bỏ từ phiên bản 3.12: Thay vào đó, hãy sử dụng PyErr_GetRaisedException() để tránh mọi hiện tượng mất chuẩn hóa có thể xảy ra.

Trong một số trường hợp nhất định, các giá trị được PyErr_Fetch() trả về bên dưới có thể "không chuẩn hóa", nghĩa là *exc là một đối tượng lớp nhưng *val không phải là một phiên bản của cùng một lớp. Hàm này có thể được sử dụng để khởi tạo lớp trong trường hợp đó. Nếu các giá trị đã được chuẩn hóa thì không có gì xảy ra. Việc chuẩn hóa chậm trễ được thực hiện để cải thiện hiệu suất.

Ghi chú

Hàm does not này ngầm đặt thuộc tính __traceback__ trên giá trị ngoại lệ. Nếu muốn thiết lập truy nguyên một cách thích hợp, cần có đoạn mã bổ sung sau:

nếu (tb != NULL) {
  PyException_SetTraceback(val, tb);
}
PyObject *PyErr_GetHandledException(void)
Một phần của ABI ổn định kể từ phiên bản 3.11.

Truy xuất phiên bản ngoại lệ đang hoạt động, như sẽ được trả về bởi sys.exception(). Điều này đề cập đến một ngoại lệ là already caught, không phải một ngoại lệ mới được nêu ra. Trả về một tham chiếu mới cho ngoại lệ hoặc NULL. Không sửa đổi trạng thái ngoại lệ của trình thông dịch.

Ghi chú

Hàm này thường không được sử dụng bởi mã muốn xử lý các ngoại lệ. Đúng hơn, nó có thể được sử dụng khi mã cần lưu và khôi phục tạm thời trạng thái ngoại lệ. Sử dụng PyErr_SetHandledException() để khôi phục hoặc xóa trạng thái ngoại lệ.

Added in version 3.11.

void PyErr_SetHandledException(PyObject *exc)
Một phần của ABI ổn định kể từ phiên bản 3.11.

Đặt ngoại lệ hoạt động, như đã biết từ sys.exception(). Điều này đề cập đến một ngoại lệ là already caught, không phải một ngoại lệ mới được nêu ra. Để xóa trạng thái ngoại lệ, hãy chuyển NULL.

Ghi chú

Hàm này thường không được sử dụng bởi mã muốn xử lý các ngoại lệ. Đúng hơn, nó có thể được sử dụng khi mã cần lưu và khôi phục tạm thời trạng thái ngoại lệ. Sử dụng PyErr_GetHandledException() để nhận trạng thái ngoại lệ.

Added in version 3.11.

void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
Một phần của ABI ổn định kể từ phiên bản 3.7.

Truy xuất cách trình bày kiểu cũ của thông tin ngoại lệ, như đã biết từ sys.exc_info(). Điều này đề cập đến một ngoại lệ là already caught, không phải một ngoại lệ mới được nêu ra. Trả về các tham chiếu mới cho ba đối tượng, bất kỳ đối tượng nào trong số đó có thể là NULL. Không sửa đổi trạng thái thông tin ngoại lệ. Chức năng này được giữ lại để tương thích ngược. Thích sử dụng PyErr_GetHandledException().

Ghi chú

Hàm này thường không được sử dụng bởi mã muốn xử lý các ngoại lệ. Đúng hơn, nó có thể được sử dụng khi mã cần lưu và khôi phục tạm thời trạng thái ngoại lệ. Sử dụng PyErr_SetExcInfo() để khôi phục hoặc xóa trạng thái ngoại lệ.

Added in version 3.3.

void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)
Một phần của ABI ổn định kể từ phiên bản 3.7.

Đặt thông tin ngoại lệ, như đã biết từ sys.exc_info(). Điều này đề cập đến một ngoại lệ là already caught, không phải một ngoại lệ mới được nêu ra. Hàm này đánh cắp các tham chiếu của các đối số. Để xóa trạng thái ngoại lệ, chuyển NULL cho cả ba đối số. Chức năng này được giữ lại để tương thích ngược. Thích sử dụng PyErr_SetHandledException() hơn.

Ghi chú

Hàm này thường không được sử dụng bởi mã muốn xử lý các ngoại lệ. Đúng hơn, nó có thể được sử dụng khi mã cần lưu và khôi phục tạm thời trạng thái ngoại lệ. Sử dụng PyErr_GetExcInfo() để đọc trạng thái ngoại lệ.

Added in version 3.3.

Thay đổi trong phiên bản 3.11: Các đối số typetraceback không còn được sử dụng nữa và có thể là NULL. Trình thông dịch bây giờ lấy chúng từ trường hợp ngoại lệ (đối số value). Hàm vẫn lấy tham chiếu của cả ba đối số.

Xử lý tín hiệu

int PyErr_CheckSignals()
Một phần của ABI ổn định.

Xử lý các gián đoạn bên ngoài, chẳng hạn như tín hiệu hoặc kích hoạt trình gỡ lỗi mà quá trình xử lý của nó bị trì hoãn cho đến khi an toàn để chạy mã Python và/hoặc đưa ra các ngoại lệ.

Ví dụ: nhấn Ctrl-C sẽ khiến thiết bị đầu cuối gửi tín hiệu signal.SIGINT. Hàm này thực thi trình xử lý tín hiệu Python tương ứng, theo mặc định, sẽ đưa ra ngoại lệ KeyboardInterrupt.

PyErr_CheckSignals() phải được gọi bằng mã C chạy đủ thường xuyên để phản hồi xuất hiện ngay lập tức đối với con người.

Các trình xử lý được gọi bởi hàm này hiện bao gồm:

  • Trình xử lý tín hiệu, bao gồm các hàm Python được đăng ký bằng mô-đun signal.

    Trình xử lý tín hiệu chỉ được chạy trong luồng chính của trình thông dịch chính.

    (Đây là nơi hàm có tên: ban đầu, tín hiệu là cách duy nhất để làm gián đoạn trình thông dịch.)

  • Chạy trình thu gom rác, nếu cần.

  • Thực thi tập lệnh remote debugger đang chờ xử lý.

Nếu bất kỳ trình xử lý nào đưa ra một ngoại lệ, hãy trả về ngay -1 với bộ ngoại lệ đó. Mọi gián đoạn còn lại sẽ được xử lý trong lệnh gọi PyErr_CheckSignals() tiếp theo, nếu thích hợp.

Nếu tất cả các trình xử lý đều kết thúc thành công hoặc không có trình xử lý nào để chạy, hãy trả về 0.

Thay đổi trong phiên bản 3.12: Chức năng này bây giờ có thể gọi trình thu gom rác.

Thay đổi trong phiên bản 3.14: Chức năng này hiện có thể thực thi tập lệnh gỡ lỗi từ xa nếu tính năng gỡ lỗi từ xa được bật.

void PyErr_SetInterrupt()
Một phần của ABI ổn định.

Mô phỏng hiệu ứng của tín hiệu SIGINT đến. Điều này tương đương với PyErr_SetInterruptEx(SIGINT).

Ghi chú

Chức năng này không đồng bộ-tín hiệu-an toàn. Nó có thể được gọi mà không cần attached thread state và từ bộ xử lý tín hiệu C.

int PyErr_SetInterruptEx(int signum)
Một phần của ABI ổn định kể từ phiên bản 3.10.

Mô phỏng tác dụng của tín hiệu đến. Lần tiếp theo PyErr_CheckSignals() được gọi, trình xử lý tín hiệu Python cho số tín hiệu đã cho sẽ được gọi.

Hàm này có thể được gọi bằng mã C để thiết lập khả năng xử lý tín hiệu của riêng nó và muốn trình xử lý tín hiệu Python được gọi như mong đợi khi có yêu cầu gián đoạn (ví dụ: khi người dùng nhấn Ctrl-C để làm gián đoạn một thao tác).

Nếu tín hiệu đã cho không được Python xử lý (nó được đặt thành signal.SIG_DFL hoặc signal.SIG_IGN), thì tín hiệu đó sẽ bị bỏ qua.

Nếu signum nằm ngoài phạm vi số tín hiệu cho phép, -1 sẽ được trả về. Nếu không, 0 sẽ được trả về. Chỉ báo lỗi không bao giờ được thay đổi bởi chức năng này.

Ghi chú

Chức năng này không đồng bộ-tín hiệu-an toàn. Nó có thể được gọi mà không cần attached thread state và từ bộ xử lý tín hiệu C.

Added in version 3.10.

int PySignal_SetWakeupFd(int fd)

Hàm tiện ích này chỉ định một bộ mô tả tệp mà số tín hiệu được ghi dưới dạng một byte bất cứ khi nào nhận được tín hiệu. fd phải không bị chặn. Nó trả về bộ mô tả tập tin trước đó.

Giá trị -1 vô hiệu hóa tính năng này; đây là trạng thái ban đầu Điều này tương đương với signal.set_wakeup_fd() trong Python nhưng không có bất kỳ kiểm tra lỗi nào. fd phải là bộ mô tả tệp hợp lệ. Hàm chỉ nên được gọi từ luồng chính.

Thay đổi trong phiên bản 3.5: Trên Windows, chức năng này hiện cũng hỗ trợ các tay cầm ổ cắm.

Các lớp ngoại lệ

PyObject *PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Hàm tiện ích này tạo và trả về một lớp ngoại lệ mới. Đối số name phải là tên của ngoại lệ mới, một chuỗi C có dạng module.classname. Các đối số basedict thường là NULL. Điều này tạo ra một đối tượng lớp có nguồn gốc từ Exception (có thể truy cập bằng C dưới dạng PyExc_Exception).

Thuộc tính __module__ của lớp mới được đặt thành phần đầu tiên (đến dấu chấm cuối cùng) của đối số name và tên lớp được đặt thành phần cuối cùng (sau dấu chấm cuối cùng). Đối số base có thể được sử dụng để chỉ định các lớp cơ sở thay thế; nó có thể chỉ là một lớp hoặc một bộ lớp. Đối số dict có thể được sử dụng để chỉ định từ điển các biến và phương thức của lớp.

PyObject *PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Tương tự như PyErr_NewException(), ngoại trừ lớp ngoại lệ mới có thể dễ dàng được cấp một chuỗi tài liệu: Nếu doc không phải là NULL, thì nó sẽ được sử dụng làm chuỗi tài liệu cho lớp ngoại lệ.

Added in version 3.2.

int PyExceptionClass_Check(PyObject *ob)

Trả về khác 0 nếu ob là một lớp ngoại lệ, nếu không thì trả về 0. Chức năng này luôn thành công.

const char *PyExceptionClass_Name(PyObject *ob)
Một phần của ABI ổn định kể từ phiên bản 3.8.

Trả về tp_name của lớp ngoại lệ ob.

Đối tượng ngoại lệ

int PyExceptionInstance_Check(PyObject *op)

Trả về true nếu op là một phiên bản của BaseException, nếu không thì trả về false. Chức năng này luôn thành công.

PyExceptionInstance_Class(op)

Tương đương với Py_TYPE(op).

PyObject *PyException_GetTraceback(PyObject *ex)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về dấu vết được liên kết với ngoại lệ dưới dạng tham chiếu mới, có thể truy cập được từ Python thông qua thuộc tính __traceback__. Nếu không có truy nguyên nào được liên kết, kết quả này sẽ trả về NULL.

int PyException_SetTraceback(PyObject *ex, PyObject *tb)
Một phần của ABI ổn định.

Đặt truy nguyên được liên kết với ngoại lệ thành tb. Sử dụng Py_None để xóa nó.

PyObject *PyException_GetContext(PyObject *ex)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về ngữ cảnh (một trường hợp ngoại lệ khác trong quá trình xử lý ex đã được nâng lên) được liên kết với ngoại lệ dưới dạng tham chiếu mới, có thể truy cập được từ Python thông qua thuộc tính __context__. Nếu không có ngữ cảnh liên quan, kết quả này sẽ trả về NULL.

void PyException_SetContext(PyObject *ex, PyObject *ctx)
Một phần của ABI ổn định.

Đặt bối cảnh liên quan đến ngoại lệ thành ctx. Sử dụng NULL để xóa nó. Không có kiểm tra loại nào để đảm bảo rằng ctx là một trường hợp ngoại lệ. Điều này đánh cắp một tham chiếu đến ctx.

PyObject *PyException_GetCause(PyObject *ex)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về nguyên nhân (có thể là một trường hợp ngoại lệ hoặc None, do raise ... from ... đặt) được liên kết với ngoại lệ dưới dạng tham chiếu mới, có thể truy cập được từ Python thông qua thuộc tính __cause__.

void PyException_SetCause(PyObject *ex, PyObject *cause)
Một phần của ABI ổn định.

Đặt nguyên nhân liên quan đến ngoại lệ thành cause. Sử dụng NULL để xóa nó. Không có kiểm tra loại nào để đảm bảo rằng cause là phiên bản ngoại lệ hoặc None. Điều này đánh cắp một tham chiếu đến cause.

Thuộc tính __suppress_context__ được đặt ngầm thành True bởi hàm này.

PyObject *PyException_GetArgs(PyObject *ex)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định kể từ phiên bản 3.12.

Trả về args của ngoại lệ ex.

void PyException_SetArgs(PyObject *ex, PyObject *args)
Một phần của ABI ổn định kể từ phiên bản 3.12.

Đặt args của ngoại lệ ex thành args.

PyObject *PyUnstable_Exc_PrepReraiseStar(PyObject *orig, PyObject *excs)
Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.

Triển khai một phần quá trình triển khai except* của trình thông dịch. orig là ngoại lệ ban đầu đã bị bắt và excs là danh sách các ngoại lệ cần được nêu ra. Danh sách này chứa phần chưa được xử lý của orig, nếu có, cũng như các ngoại lệ được nêu ra từ các mệnh đề except* (vì vậy chúng có một truy nguyên khác với orig) và những phần đã được nâng cấp lại (và có cùng truy nguyên như orig). Trả về ExceptionGroup cuối cùng cần reraise, hoặc None nếu không còn gì để reraise.

Added in version 3.12.

Đối tượng ngoại lệ Unicode

Các hàm sau được sử dụng để tạo và sửa đổi các ngoại lệ Unicode từ C.

PyObject *PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Tạo một đối tượng UnicodeDecodeError với các thuộc tính encoding, object, length, start, endreason. encodingreason là các chuỗi được mã hóa UTF-8.

PyObject *PyUnicodeDecodeError_GetEncoding(PyObject *exc)
PyObject *PyUnicodeEncodeError_GetEncoding(PyObject *exc)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về thuộc tính encoding của đối tượng ngoại lệ đã cho.

PyObject *PyUnicodeDecodeError_GetObject(PyObject *exc)
PyObject *PyUnicodeEncodeError_GetObject(PyObject *exc)
PyObject *PyUnicodeTranslateError_GetObject(PyObject *exc)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về thuộc tính object của đối tượng ngoại lệ đã cho.

int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
Một phần của ABI ổn định.

Lấy thuộc tính start của đối tượng ngoại lệ đã cho và đặt nó vào *start. start không được là NULL. Trả về 0 nếu thành công, -1 nếu thất bại.

Nếu UnicodeError.object là một chuỗi trống thì kết quả start0. Nếu không, nó sẽ bị cắt thành [0, len(object) - 1].

Xem thêm

UnicodeError.start

int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
Một phần của ABI ổn định.

Đặt thuộc tính start của đối tượng ngoại lệ đã cho thành start. Trả về 0 nếu thành công, -1 nếu thất bại.

Ghi chú

Mặc dù việc chuyển start âm không tạo ra ngoại lệ, nhưng getters tương ứng sẽ không coi đó là phần bù tương đối.

int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)
Một phần của ABI ổn định.

Lấy thuộc tính end của đối tượng ngoại lệ đã cho và đặt nó vào *end. end không được là NULL. Trả về 0 nếu thành công, -1 nếu thất bại.

Nếu UnicodeError.object là một chuỗi trống thì kết quả end0. Nếu không, nó sẽ bị cắt thành [1, len(object)].

int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
Một phần của ABI ổn định.

Đặt thuộc tính end của đối tượng ngoại lệ đã cho thành end. Trả về 0 nếu thành công, -1 nếu thất bại.

Xem thêm

UnicodeError.end

PyObject *PyUnicodeDecodeError_GetReason(PyObject *exc)
PyObject *PyUnicodeEncodeError_GetReason(PyObject *exc)
PyObject *PyUnicodeTranslateError_GetReason(PyObject *exc)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về thuộc tính reason của đối tượng ngoại lệ đã cho.

int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
Một phần của ABI ổn định.

Đặt thuộc tính reason của đối tượng ngoại lệ đã cho thành reason. Trả về 0 nếu thành công, -1 nếu thất bại.

Kiểm soát đệ quy

Hai chức năng này cung cấp một cách để thực hiện các lệnh gọi đệ quy an toàn ở cấp độ C, cả trong lõi và trong các mô-đun mở rộng. Chúng cần thiết nếu mã đệ quy không nhất thiết phải gọi mã Python (tự động theo dõi độ sâu đệ quy của nó). Chúng cũng không cần thiết cho việc triển khai tp_callcall protocol đảm nhiệm việc xử lý đệ quy.

int Py_EnterRecursiveCall(const char *where)
Một phần của ABI ổn định kể từ phiên bản 3.9.

Đánh dấu điểm mà cuộc gọi cấp C đệ quy sắp được thực hiện.

Sau đó, hàm này sẽ kiểm tra xem đã đạt đến giới hạn ngăn xếp hay chưa. Trong trường hợp này, RecursionError được đặt và trả về giá trị khác 0. Nếu không, số 0 sẽ được trả về.

where phải là chuỗi được mã hóa UTF-8, chẳng hạn như " in instance check" để được nối với thông báo RecursionError do giới hạn độ sâu đệ quy gây ra.

Thay đổi trong phiên bản 3.9: Chức năng này hiện cũng có sẵn trong limited API.

void Py_LeaveRecursiveCall(void)
Một phần của ABI ổn định kể từ phiên bản 3.9.

Kết thúc một Py_EnterRecursiveCall(). Phải được gọi một lần cho mỗi lệnh gọi successful của Py_EnterRecursiveCall().

Thay đổi trong phiên bản 3.9: Chức năng này hiện cũng có sẵn trong limited API.

Việc triển khai tp_repr đúng cách cho các loại vùng chứa yêu cầu xử lý đệ quy đặc biệt. Ngoài việc bảo vệ ngăn xếp, tp_repr còn cần theo dõi các đối tượng để ngăn chặn chu kỳ. Hai chức năng sau đây hỗ trợ chức năng này. Thực tế, đây là C tương đương với reprlib.recursive_repr().

int Py_ReprEnter(PyObject *object)
Một phần của ABI ổn định.

Được gọi khi bắt đầu triển khai tp_repr để phát hiện chu kỳ.

Nếu đối tượng đã được xử lý, hàm trả về một số nguyên dương. Trong trường hợp đó, việc triển khai tp_repr sẽ trả về một đối tượng chuỗi biểu thị một chu kỳ. Ví dụ: đối tượng dict trả về {...} và đối tượng list trả về [...].

Hàm sẽ trả về số nguyên âm nếu đạt đến giới hạn đệ quy. Trong trường hợp đó, việc triển khai tp_repr thường sẽ trả về NULL.

Nếu không, hàm trả về 0 và quá trình triển khai tp_repr có thể tiếp tục bình thường.

void Py_ReprLeave(PyObject *object)
Một phần của ABI ổn định.

Kết thúc một Py_ReprEnter(). Phải được gọi một lần cho mỗi lệnh gọi Py_ReprEnter() trả về 0.

int Py_GetRecursionLimit(void)
Một phần của ABI ổn định.

Nhận giới hạn đệ quy cho trình thông dịch hiện tại. Nó có thể được thiết lập với Py_SetRecursionLimit(). Giới hạn đệ quy ngăn ngăn xếp trình thông dịch Python phát triển vô hạn.

Chức năng này không thể thất bại và người gọi phải giữ attached thread state.

void Py_SetRecursionLimit(int new_limit)
Một phần của ABI ổn định.

Đặt giới hạn đệ quy cho trình thông dịch hiện tại.

Chức năng này không thể thất bại và người gọi phải giữ attached thread state.

Các loại ngoại lệ và cảnh báo

Tất cả các danh mục cảnh báo và ngoại lệ tiêu chuẩn của Python đều có sẵn dưới dạng các biến toàn cục có tên là PyExc_, theo sau là tên ngoại lệ Python. Chúng có loại PyObject*; chúng đều là các đối tượng của lớp.

Để đầy đủ, đây là tất cả các biến:

Các loại ngoại lệ

Tên C

Tên Python

PyObject *PyExc_BaseException
Một phần của ABI ổn định.

BaseException

PyObject *PyExc_BaseExceptionGroup
Một phần của ABI ổn định kể từ phiên bản 3.11.

BaseExceptionGroup

PyObject *PyExc_Exception
Một phần của ABI ổn định.

Exception

PyObject *PyExc_ArithmeticError
Một phần của ABI ổn định.

ArithmeticError

PyObject *PyExc_AssertionError
Một phần của ABI ổn định.

AssertionError

PyObject *PyExc_AttributeError
Một phần của ABI ổn định.

AttributeError

PyObject *PyExc_BlockingIOError
Một phần của ABI ổn định kể từ phiên bản 3.7.

BlockingIOError

PyObject *PyExc_BrokenPipeError
Một phần của ABI ổn định kể từ phiên bản 3.7.

BrokenPipeError

PyObject *PyExc_BufferError
Một phần của ABI ổn định.

BufferError

PyObject *PyExc_ChildProcessError
Một phần của ABI ổn định kể từ phiên bản 3.7.

ChildProcessError

PyObject *PyExc_ConnectionAbortedError
Một phần của ABI ổn định kể từ phiên bản 3.7.

ConnectionAbortedError

PyObject *PyExc_ConnectionError
Một phần của ABI ổn định kể từ phiên bản 3.7.

ConnectionError

PyObject *PyExc_ConnectionRefusedError
Một phần của ABI ổn định kể từ phiên bản 3.7.

ConnectionRefusedError

PyObject *PyExc_ConnectionResetError
Một phần của ABI ổn định kể từ phiên bản 3.7.

ConnectionResetError

PyObject *PyExc_EOFError
Một phần của ABI ổn định.

EOFError

PyObject *PyExc_FileExistsError
Một phần của ABI ổn định kể từ phiên bản 3.7.

FileExistsError

PyObject *PyExc_FileNotFoundError
Một phần của ABI ổn định kể từ phiên bản 3.7.

FileNotFoundError

PyObject *PyExc_FloatingPointError
Một phần của ABI ổn định.

FloatingPointError

PyObject *PyExc_GeneratorExit
Một phần của ABI ổn định.

GeneratorExit

PyObject *PyExc_ImportError
Một phần của ABI ổn định.

ImportError

PyObject *PyExc_IndentationError
Một phần của ABI ổn định.

IndentationError

PyObject *PyExc_IndexError
Một phần của ABI ổn định.

IndexError

PyObject *PyExc_InterruptedError
Một phần của ABI ổn định kể từ phiên bản 3.7.

InterruptedError

PyObject *PyExc_IsADirectoryError
Một phần của ABI ổn định kể từ phiên bản 3.7.

IsADirectoryError

PyObject *PyExc_KeyError
Một phần của ABI ổn định.

KeyError

PyObject *PyExc_KeyboardInterrupt
Một phần của ABI ổn định.

KeyboardInterrupt

PyObject *PyExc_LookupError
Một phần của ABI ổn định.

LookupError

PyObject *PyExc_MemoryError
Một phần của ABI ổn định.

MemoryError

PyObject *PyExc_ModuleNotFoundError
Một phần của ABI ổn định kể từ phiên bản 3.6.

ModuleNotFoundError

PyObject *PyExc_NameError
Một phần của ABI ổn định.

NameError

PyObject *PyExc_NotADirectoryError
Một phần của ABI ổn định kể từ phiên bản 3.7.

NotADirectoryError

PyObject *PyExc_NotImplementedError
Một phần của ABI ổn định.

NotImplementedError

PyObject *PyExc_OSError
Một phần của ABI ổn định.

OSError

PyObject *PyExc_OverflowError
Một phần của ABI ổn định.

OverflowError

PyObject *PyExc_PermissionError
Một phần của ABI ổn định kể từ phiên bản 3.7.

PermissionError

PyObject *PyExc_ProcessLookupError
Một phần của ABI ổn định kể từ phiên bản 3.7.

ProcessLookupError

PyObject *PyExc_PythonFinalizationError

PythonFinalizationError

PyObject *PyExc_RecursionError
Một phần của ABI ổn định kể từ phiên bản 3.7.

RecursionError

PyObject *PyExc_ReferenceError
Một phần của ABI ổn định.

ReferenceError

PyObject *PyExc_RuntimeError
Một phần của ABI ổn định.

RuntimeError

PyObject *PyExc_StopAsyncIteration
Một phần của ABI ổn định kể từ phiên bản 3.7.

StopAsyncIteration

PyObject *PyExc_StopIteration
Một phần của ABI ổn định.

StopIteration

PyObject *PyExc_SyntaxError
Một phần của ABI ổn định.

SyntaxError

PyObject *PyExc_SystemError
Một phần của ABI ổn định.

SystemError

PyObject *PyExc_SystemExit
Một phần của ABI ổn định.

SystemExit

PyObject *PyExc_TabError
Một phần của ABI ổn định.

TabError

PyObject *PyExc_TimeoutError
Một phần của ABI ổn định kể từ phiên bản 3.7.

TimeoutError

PyObject *PyExc_TypeError
Một phần của ABI ổn định.

TypeError

PyObject *PyExc_UnboundLocalError
Một phần của ABI ổn định.

UnboundLocalError

PyObject *PyExc_UnicodeDecodeError
Một phần của ABI ổn định.

UnicodeDecodeError

PyObject *PyExc_UnicodeEncodeError
Một phần của ABI ổn định.

UnicodeEncodeError

PyObject *PyExc_UnicodeError
Một phần của ABI ổn định.

UnicodeError

PyObject *PyExc_UnicodeTranslateError
Một phần của ABI ổn định.

UnicodeTranslateError

PyObject *PyExc_ValueError
Một phần của ABI ổn định.

ValueError

PyObject *PyExc_ZeroDivisionError
Một phần của ABI ổn định.

ZeroDivisionError

Added in version 3.5: PyExc_StopAsyncIterationPyExc_RecursionError.

Added in version 3.6: PyExc_ModuleNotFoundError.

Added in version 3.11: PyExc_BaseExceptionGroup.

Bí danh OSError

Sau đây là các bí danh tương thích với PyExc_OSError.

Thay đổi trong phiên bản 3.3: Những bí danh này từng là loại ngoại lệ riêng biệt.

Tên C

Tên Python

Ghi chú

PyObject *PyExc_EnvironmentError
Một phần của ABI ổn định.

OSError

PyObject *PyExc_IOError
Một phần của ABI ổn định.

OSError

PyObject *PyExc_WindowsError
Một phần của ABI ổn định on Windows kể từ phiên bản 3.7.

OSError

[thắng]

Ghi chú:

[win]

PyExc_WindowsError chỉ được xác định trên Windows; bảo vệ mã sử dụng điều này bằng cách kiểm tra xem macro tiền xử lý MS_WINDOWS đã được xác định chưa.

Các loại cảnh báo

Tên C

Tên Python

PyObject *PyExc_Warning
Một phần của ABI ổn định.

Warning

PyObject *PyExc_BytesWarning
Một phần của ABI ổn định.

BytesWarning

PyObject *PyExc_DeprecationWarning
Một phần của ABI ổn định.

DeprecationWarning

PyObject *PyExc_EncodingWarning
Một phần của ABI ổn định kể từ phiên bản 3.10.

EncodingWarning

PyObject *PyExc_FutureWarning
Một phần của ABI ổn định.

FutureWarning

PyObject *PyExc_ImportWarning
Một phần của ABI ổn định.

ImportWarning

PyObject *PyExc_PendingDeprecationWarning
Một phần của ABI ổn định.

PendingDeprecationWarning

PyObject *PyExc_ResourceWarning
Một phần của ABI ổn định kể từ phiên bản 3.7.

ResourceWarning

PyObject *PyExc_RuntimeWarning
Một phần của ABI ổn định.

RuntimeWarning

PyObject *PyExc_SyntaxWarning
Một phần của ABI ổn định.

SyntaxWarning

PyObject *PyExc_UnicodeWarning
Một phần của ABI ổn định.

UnicodeWarning

PyObject *PyExc_UserWarning
Một phần của ABI ổn định.

UserWarning

Added in version 3.2: PyExc_ResourceWarning.

Added in version 3.10: PyExc_EncodingWarning.

Truy nguyên

PyTypeObject PyTraceBack_Type
Một phần của ABI ổn định.

Nhập đối tượng cho các đối tượng truy nguyên. Điều này có sẵn dưới dạng types.TracebackType trong lớp Python.

int PyTraceBack_Check(PyObject *op)

Trả về true nếu op là đối tượng truy nguyên, ngược lại là sai. Chức năng này không tính đến các kiểu con.

int PyTraceBack_Here(PyFrameObject *f)
Một phần của ABI ổn định.

Thay thế thuộc tính __traceback__ trên ngoại lệ hiện tại bằng một truy nguyên mới thêm f vào chuỗi hiện có.

Gọi hàm này mà không đặt ngoại lệ là hành vi không xác định.

Hàm này trả về 0 nếu thành công và trả về -1 với ngoại lệ được đặt nếu thất bại.

int PyTraceBack_Print(PyObject *tb, PyObject *f)
Một phần của ABI ổn định.

Viết traceback tb vào file f.

Hàm này trả về 0 nếu thành công và trả về -1 với ngoại lệ được đặt nếu thất bại.