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.stderrvà 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ảnSystemExit.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ữasys.last_type,sys.last_valuevàsys.last_tracebackcũ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.stderrkhi 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 obj là
NULLthì 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 obj là
NULL.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ư trongPyUnicode_FromFormat().PyErr_WriteUnraisable(obj)gần tương đương vớiPyErr_FormatUnraisable("Exception ignored in: %R", obj). Nếu format làNULLthì 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đếnsys.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ớiPy_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ư trongPyUnicode_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_listthay 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ể ghireturn 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ênerrnovà mục thứ hai là thông báo lỗi tương ứng (nhận được từstrerror()), sau đó gọiPyErr_SetObject(type, object). Trên Unix, khi giá trịerrnolàEINTR, biểu thị lệnh gọi hệ thống bị gián đoạn, lệnh gọi này sẽ gọiPyErr_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ể ghireturn 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àNULLthì 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ínhfilenamecủ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ủa0, mã lỗi được trả về bởi lệnh gọi tớiGetLastError()sẽ được sử dụng thay thế. Nó gọi hàm Win32FormatMessage()để truy xuất mô tả mã lỗi của Windows do ierr hoặcGetLastError()cung cấp, sau đó nó xây dựng một đối tượngOSErrorvới thuộc tínhwinerrorđược đặt thành mã lỗi, thuộc tínhstrerrorđược đặt thành thông báo lỗi tương ứng (lấy từFormatMessage()), rồi gọiPyErr_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àNULLthì 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ủaOSErrorlàm tham số thứ ba được sử dụng để xác định thuộc tínhfilenamecủ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àNULLthì nó sẽ được chuyển đến hàm tạo củaOSErrordưới dạng tham số thứ ba được sử dụng để xác định thuộc tínhfilenamecủ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ệ. name và path, cả hai đều có thể làNULL, sẽ được đặt làm thuộc tínhnamevàpathtương ứng củaImportError.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ủaImportErrorđể 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à
SyntaxErrorthì 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_lineno và end_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
strcủ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ề
NULLmà 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 filename là const 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ọiPyErr_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_Warninglà lớp con củaPyExc_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
warningsvà tùy chọn-Wtrong 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ố module và registry có thể được đặt thànhNULLđể 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ừ message và module 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ụngPyUnicode_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ụngPyUnicode_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 category làResourceWarningvà nó chuyển source sangwarnings.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ớiPyErr_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ảiPy_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ề
NULLnế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àNULLngay 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, value và traceback, 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ạiNULLvà giá trị không phảiNULLhoặ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à*exclà một đối tượng lớp nhưng*valkhô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ặcNULL. 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ểnNULL.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ụngPyErr_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ểnNULLcho cả ba đối số. Chức năng này được giữ lại để tương thích ngược. Thích sử dụngPyErr_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ố
typevàtracebackkhô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
-1với bộ ngoại lệ đó. Mọi gián đoạn còn lại sẽ được xử lý trong lệnh gọiPyErr_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ớiPyErr_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_DFLhoặcsignal.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,
-1sẽ được trả về. Nếu không,0sẽ đượ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ị
-1vô 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ớisignal.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ố base và dict 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ạngPyExc_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_namecủ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, doraise ... 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ặcNone. Đ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ànhTruebở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ề
argscủ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
argscủ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ềExceptionGroupcuối cùng cần reraise, hoặcNonenế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
UnicodeDecodeErrorvới các thuộc tính encoding, object, length, start, end và reason. encoding và reason 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ề0nếu thành công,-1nếu thất bại.Nếu
UnicodeError.objectlà một chuỗi trống thì kết quả start là0. Nếu không, nó sẽ bị cắt thành[0, len(object) - 1].Xem thêm
-
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ề
0nếu thành công,-1nế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ề0nếu thành công,-1nếu thất bại.Nếu
UnicodeError.objectlà một chuỗi trống thì kết quả end là0. 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ề
0nếu thành công,-1nếu thất bại.Xem thêm
-
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ề
0nếu thành công,-1nế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_call vì call 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áoRecursionErrordo giới hạn độ sâu đệ quy gây ra.Xem thêm
Chức năng
PyUnstable_ThreadState_SetStackProtection().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ủaPy_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_reprsẽ trả về một đối tượng chuỗi biểu thị một chu kỳ. Ví dụ: đối tượngdicttrả về{...}và đối tượnglisttrả 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_reprthường sẽ trả vềNULL.Nếu không, hàm trả về 0 và quá trình triển khai
tp_reprcó 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ọiPy_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.
Xem thêm
-
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.
Xem thêm
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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Added in version 3.3: PyExc_BlockingIOError, PyExc_BrokenPipeError, PyExc_ChildProcessError, PyExc_ConnectionError, PyExc_ConnectionAbortedError, PyExc_ConnectionRefusedError, PyExc_ConnectionResetError, PyExc_FileExistsError, PyExc_FileNotFoundError, PyExc_InterruptedError, PyExc_IsADirectoryError, PyExc_NotADirectoryError, PyExc_PermissionError, PyExc_ProcessLookupError và PyExc_TimeoutError được giới thiệu sau PEP 3151.
Added in version 3.5: PyExc_StopAsyncIteration và PyExc_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ú |
|---|---|---|
|
||
|
||
|
[thắng] |
Ghi chú:
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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.TracebackTypetrong 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ề
0nếu thành công và trả về-1vớ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ề
0nếu thành công và trả về-1với ngoại lệ được đặt nếu thất bại.