Các chức năng được mô tả trong chương này sẽ cho phép bạn xử lý và đưa ra các ngoại lệ 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ệ Python. Nó hoạt động giống như biến POSIX
if [tb != NULL] { PyException_SetTraceback[val, tb]; }2. có một chỉ báo chung [trên mỗi luồng] về lỗi cuối cùng đã xảy ra. Hầu hết các chức năng API C 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à
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 nếu chúng được cho là trả về một con trỏ hoặc
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 nếu chúng trả về một số nguyên [ngoại lệ. các hàm
if [tb != NULL] { PyException_SetTraceback[val, tb]; }5 trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }6 nếu thành công và
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 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ị của ngoại lệ và đối tượng truy nguyên. Bất kỳ con trỏ nào trong số đó có thể là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 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
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 nếu loại ngoại lệ là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3]
Khi một chức năng phải bị lỗi vì một số chức năng mà nó gọi là không thành công, nó thường không đặt chỉ báo lỗ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ó nắm giữ [chẳng hạn như tham chiếu đối tượng hoặc cấp phát bộ nhớ]; . 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 phổ biến cẩn thận, các lệnh gọi bổ sung vào API Python/C có thể không hoạt động như dự kiến và có thể thất bại theo những cách bí ẩn
Ghi chú
Chỉ báo lỗi không phải là kết quả của. 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 ấn và thanh toán bù trừ
void PyErr_Clear[]Một phần của.
Xóa chỉ báo lỗi. Nếu chỉ báo lỗi không được đặt, sẽ không có hiệu lực
void PyErr_PrintEx[int set_sys_last_vars]Part of the .
In truy nguyên tiêu chuẩn tới
if [tb != NULL] { PyException_SetTraceback[val, tb]; }2 và xóa chỉ báo lỗi. Trừ khi lỗi là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3, 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 đối tượng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3
Chỉ gọi chức năng này khi chỉ báo lỗi được đặt. Nếu không nó sẽ gây ra một lỗi nghiêm trọng
Nếu set_sys_last_vars khác không, các biến và sẽ được đặt thành loại, giá trị và truy xuất ngược của ngoại lệ được in tương ứng
void PyErr_Print[]Một phần của.
Bí danh cho
if [tb != NULL] { PyException_SetTraceback[val, tb]; }8void PyErr_WriteUnraisable[ *obj]
Part of the .
Gọi bằng ngoại lệ hiện tại và đối số obj
Chức năng tiện ích này in một thông báo cảnh báo tới
if [tb != NULL] { PyException_SetTraceback[val, tb]; }2 khi một ngoại lệ đã được đặt nhưng trình thông dịch thực sự không thể đưa ra ngoại lệ. Nó được sử dụng, ví dụ, khi một ngoại lệ xảy ra trong một phương thức
if [tb != NULL] { PyException_SetTraceback[val, tb]; }21
Hàm được gọi với một đối số duy nhất obj xác định ngữ cảnh xảy ra ngoại lệ không thể kích hoạt. Nếu có thể, repr của obj sẽ được in trong thông báo cảnh báo
Một ngoại lệ phải được đặt khi gọi chức năng này
Tăng 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ỏ
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 để sử dụng trong câu lệnh
if [tb != NULL] { PyException_SetTraceback[val, tb]; }23void PyErr_SetString[ *loại, const char *message]
Part of the .
Đâ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ệ; . g.
if [tb != NULL] { PyException_SetTraceback[val, tb]; }24. Bạn không cần tăng số lượng tham chiếu của nó. Đối số thứ hai là một thông báo lỗi; void PyErr_SetObject[ *loại, *value]
Part of the .
Hàm này tương tự 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ệ
*PyErr_Format[ *ngoại lệ, const char *format, ...]Trả về giá trị. Luôn NULL. một phần của.
Hàm này đặt chỉ báo lỗi và trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. ngoại lệ phải là một lớp ngoại lệ Python. Định dạng và các tham số tiếp theo giúp định dạng thông báo lỗi; . định dạng là một chuỗi mã hóa ASCII *PyErr_FormatV[ *ngoại lệ, const char *format, va_list vargs]
Return value: Always NULL. Part of the since version 3.5.
Tương tự như , nhưng sử dụng đối số
if [tb != NULL] { PyException_SetTraceback[val, tb]; }30 thay vì số lượng đối số thay đổi
Mới trong phiên bản 3. 5
void PyErr_SetNone[ *loại]Part of the .
Đây là cách viết tắt của
if [tb != NULL] { PyException_SetTraceback[val, tb]; }31int PyErr_BadArgument[]
Một phần của.
Đây là cách viết tắt của
if [tb != NULL] { PyException_SetTraceback[val, tb]; }32, trong đó thông báo cho biết rằng một hoạt động tích hợp đã được gọi với một đối số không hợp lệ. Nó chủ yếu là để sử dụng nội bộ *PyErr_NoMemory[]
Giá trị trả về. Luôn NULL. một phần của.
Đây là cách viết tắt của
if [tb != NULL] { PyException_SetTraceback[val, tb]; }33; *PyErr_SetFromErrno[ *loại]
Return value: Always NULL. Part of the .
Đây là một chức năng tiện lợi để đưa ra một ngoại lệ khi một chức năng thư viện C đã trả về lỗi và đặt biến C
if [tb != NULL] { PyException_SetTraceback[val, tb]; }2. Nó xây dựng một đối tượng tuple có mục đầu tiên là giá trị số nguyên
if [tb != NULL] { PyException_SetTraceback[val, tb]; }2 và mục thứ hai là thông báo lỗi tương ứng [nhận được từ
if [tb != NULL] { PyException_SetTraceback[val, tb]; }38], sau đó gọi
if [tb != NULL] { PyException_SetTraceback[val, tb]; }39. Trên Unix, khi giá trị
if [tb != NULL] { PyException_SetTraceback[val, tb]; }2 là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }41, biểu thị cuộc gọi hệ thống bị gián đoạn, cuộc gọi này và nếu điều đó đặt chỉ báo lỗi, hãy để nó được đặt thành đó. Hàm luôn trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3, do đó, hàm bao quanh lệnh gọi hệ thống có thể ghi
if [tb != NULL] { PyException_SetTraceback[val, tb]; }44 khi lệnh gọi hệ thống trả về lỗi *PyErr_SetFromErrnoWithFilenameObject[ *loại, *filenameObject]
Return value: Always NULL. Part of the .
Tương tự như , với hành vi bổ sung là nếu tên tệpObject không phải là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3, thì nó được chuyển đến hàm tạo của loại dưới dạng tham số thứ ba. Trong trường hợp ngoại lệ, điều này được sử dụng để xác định thuộc tính
if [tb != NULL] { PyException_SetTraceback[val, tb]; }48 của trường hợp ngoại lệ *PyErr_SetFromErrnoWithFilenameObjects[ *loại, *filenameObject, *filenameObject2]
Return value: Always NULL. Part of the since version 3.7.
Tương tự như , nhưng lấy một đối tượng tên tệp thứ hai, để phát sinh lỗi khi một hàm nhận hai tên tệp không thành công
Mới trong phiên bản 3. 4
*PyErr_SetFromErrnoWithFilename[ *loại, const char *filename]Return value: Always NULL. Part of the .
Tương tự như , nhưng tên tệp được cung cấp dưới dạng chuỗi C. tên tệp được giải mã từ
*PyErr_SetFromWindowsErr[int ierr]Return value: Always NULL. Part of the on Windows since version 3.7.
Đây là một chức năng thuận tiện để nâng cao. Nếu được gọi với ierr là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7, mã lỗi được trả về bởi lệnh gọi tới
if [tb != NULL] { PyException_SetTraceback[val, tb]; }53 sẽ được sử dụng thay thế. Nó gọi hàm Win32
if [tb != NULL] { PyException_SetTraceback[val, tb]; }54 để truy xuất mô tả Windows về mã lỗi do ierr hoặc
if [tb != NULL] { PyException_SetTraceback[val, tb]; }53 cung cấp, sau đó nó xây dựng một đối tượng bộ có mục đầu tiên là giá trị ierr và mục thứ hai là thông báo lỗi tương ứng [nhận được từ
if [tb != NULL] { PyException_SetTraceback[val, tb]; }54], sau đó . Hàm này luôn trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3
các cửa sổ
*PyErr_SetExcFromWindowsErr[ *loại, int ierr]Return value: Always NULL. Part of the on Windows since version 3.7.
Tương tự như , với một tham số bổ sung chỉ định loại ngoại lệ sẽ được nêu ra
các cửa sổ
*PyErr_SetFromWindowsErrWithFilename[int ierr, const char *filename]Return value: Always NULL. Part of the on Windows since version 3.7.
Tương tự như
if [tb != NULL] { PyException_SetTraceback[val, tb]; }60, nhưng tên tệp được cung cấp dưới dạng chuỗi C. tên tệp được giải mã từ mã hóa hệ thống tệp []
các cửa sổ
*PyErr_SetExcFromWindowsErrWithFilenameObject[ *loại, int ierr, *filename]Return value: Always NULL. Part of the on Windows since version 3.7.
Tương tự như
if [tb != NULL] { PyException_SetTraceback[val, tb]; }60, với một tham số bổ sung chỉ định loại ngoại lệ sẽ được nâng lên
các cửa sổ
*PyErr_SetExcFromWindowsErrWithFilenameObjects[ *loại, int ierr, *filename, *filename2]Return value: Always NULL. Part of the on Windows since version 3.7.
Tương tự như , nhưng chấp nhận đối tượng tên tệp thứ hai
các cửa sổ
Mới trong phiên bản 3. 4
*PyErr_SetExcFromWindowsErrWithFilename[ *loại, int ierr, const char *filename]Return value: Always NULL. Part of the on Windows since version 3.7.
Tương tự như , với một tham số bổ sung chỉ định loại ngoại lệ sẽ được nêu ra
các cửa sổ
*PyErr_SetImportError[ *tin nhắn, *name, *path]Return value: Always NULL. Part of the since version 3.7.
Đây là một chức năng thuận tiện để nâng cao. msg sẽ được đặt làm chuỗi thông báo ngoại lệ. tên và đường dẫn, cả hai đều có thể là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3, sẽ được đặt làm thuộc tính
if [tb != NULL] { PyException_SetTraceback[val, tb]; }68 và
if [tb != NULL] { PyException_SetTraceback[val, tb]; }69 tương ứng
Mới trong phiên bản 3. 3
*PyErr_SetImportErrorSubclass[ *ngoại lệ, *msg, *name, *path]Return value: Always NULL. Part of the since version 3.6.
Rất giống nhưng chức năng này cho phép chỉ định một phân lớp để nâng cao
Mới trong phiên bản 3. 6
void PyErr_SyntaxLocationObject[ *tên tệp, int lineno, int col_offset]Set file, line, and offset information for the current exception. If the current exception is not a , then it sets additional attributes, which make the exception printing subsystem think the exception is a .
Mới trong phiên bản 3. 4
void PyErr_SyntaxLocationEx[const char *filename, int lineno, int col_offset]Part of the since version 3.7.
Giống như, nhưng tên tệp là một chuỗi byte được giải mã từ
Mới trong phiên bản 3. 2
void PyErr_SyntaxLocation[const char *filename, int lineno]Part of the .
Like , nhưng thông số col_offset bị bỏ qua
void PyErr_BadInternalCall[]Một phần của.
Đây là cách viết tắt của
if [tb != NULL] { PyException_SetTraceback[val, tb]; }76, trong đó thông báo chỉ ra rằng một hoạt động nội bộ [e. g. một hàm API Python/C] đã được gọi với một đối số không hợp lệ. Nó chủ yếu là để sử dụng nội bộ
đưa ra cảnh báo
Sử dụng các chức năng này để đưa ra cảnh báo từ mã C. Chúng phản ánh các chức năng tương tự được xuất bởi mô-đun Python. Họ thường in một thông báo cảnh báo tới sys. tiêu chuẩn; . Cũng có thể các chức năng đưa ra một ngoại lệ do sự cố với bộ máy cảnh báo. Giá trị trả về là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 nếu không có ngoại lệ nào được đưa ra hoặc
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 nếu có ngoại lệ được đưa ra. [Không thể xác định liệu 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à sự cố ý. ] Nếu một ngoại lệ được đưa ra, người gọi nên thực hiện xử lý ngoại lệ thông thường của nó [ví dụ: các tham chiếu được sở hữu và trả về giá trị lỗi]int PyErr_WarnEx[ *danh mục, const char *message, stack_level]
Part of the .
Đưa ra thông báo cảnh báo. Đối số danh mục là danh mục cảnh báo [xem bên dưới] hoặc
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3; . stack_level là một số dương cho một số khung ngăn xếp; . Một stack_level của 1 là chức năng gọi , 2 là chức năng trên đó, v.v.
Danh mục cảnh báo phải là phân lớp của
if [tb != NULL] { PyException_SetTraceback[val, tb]; }33; . Các danh mục cảnh báo tiêu chuẩn của Python có sẵn dưới dạng các biến toàn cục có tên được liệt kê tại
Để 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 và tùy chọn trong tài liệu dòng lệnh. Không có API C để kiểm soát cảnh báo
int PyErr_WarnExplicitObject[ *danh mục, *message, *filename, int lineno, *module, *registry]Issue a warning message with explicit control over all warning attributes. This is a straightforward wrapper around the Python function ; see there for more information. The module and registry arguments may be set to
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 to get the default effect described there.
Mới trong phiên bản 3. 4
int PyErr_WarnExplicit[ *danh mục, const char *message, const char *filename, int lineno, const char *module, *registry]Part of the .
Tương tự ngoại trừ thông báo và mô-đun đó là các chuỗi được mã hóa UTF-8 và tên tệp được giải mã từ
int PyErr_WarnFormat[ *danh mục, stack_level, const char *format, ...]Một phần của.
Chức năng tương tự như , nhưng dùng để định dạng thông báo cảnh báo. định dạng là một chuỗi mã hóa ASCII
Mới trong phiên bản 3. 2
int PyErr_ResourceWarning[ *nguồn, stack_level, const char *format, ...]Một phần của phiên bản 3. 6.
Chức năng tương tự như , nhưng danh mục là và nó chuyển nguồn tới
if [tb != NULL] { PyException_SetTraceback[val, tb]; }36
Mới trong phiên bản 3. 6
Truy vấn chỉ báo lỗi
*PyErr_Occurred[]Giá trị trả về. Tài liệu tham khảo mượn. một phần của.
Kiểm tra xem chỉ báo lỗi có được đặt không. Nếu được đặt, hãy trả về loại ngoại lệ [đối số đầu tiên cho lệnh gọi cuối cùng tới một trong các hàm
if [tb != NULL] { PyException_SetTraceback[val, tb]; }37 hoặc tới ]. Nếu không được đặt, hãy trả lại
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Bạn không sở hữu một tham chiếu đến giá trị trả về, vì vậy bạn không cần nó
Người gọi phải giữ GIL
Ghi chú
Không so sánh giá trị trả về với một ngoại lệ cụ thể; . [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 là một ngoại lệ của lớp hoặc nó có thể là một lớp con của ngoại lệ dự kiến. ]
int PyErr_ExceptionMatches[ *exc]Part of the .
Tương đương với
if [tb != NULL] { PyException_SetTraceback[val, tb]; }02. Điều này chỉ nên được gọi khi một ngoại lệ thực sự được thiết lập;
Part of the .
Trả về true nếu ngoại lệ đã cho khớp với loại ngoại lệ trong excel. Nếu exc là một đối tượng của lớp, điều này cũng trả về true khi đã cho là một thể hiện của một lớp con. Nếu exc là một bộ, thì tất cả các loại ngoại lệ trong bộ [và đệ quy trong các bộ con] đều được tìm kiếm để khớp
void PyErr_Fetch[ **ptype, **pvalue, **ptraceback]Part of the .
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
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Nếu nó đượ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à
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 ngay cả khi đối tượng loại không
Ghi chú
Chức năng này thường chỉ đượ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 chỉ báo lỗi tạm thời, e. g
{ PyObject *type, *value, *traceback; PyErr_Fetch[&type, &value, &traceback]; /* .. code that might produce other errors .. */ PyErr_Restore[type, value, traceback]; }void PyErr_Restore[ *loại, *value, *traceback]
Part of the .
Đặt chỉ báo lỗi từ ba đối tượng. Nếu chỉ báo lỗi đã được đặt, nó sẽ bị xóa trước. Nếu các đối tượng là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3, chỉ báo lỗi sẽ bị xóa. Không chuyển một loại
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 và giá trị không phải
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 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 đề tế nhị sau này. ] Cuộc gọi này 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 những tham chiếu này nữa. [Nếu bạn không hiểu điều này, đừ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ã cần lưu và khôi phục tạm thời chỉ báo lỗi. Sử dụng để lưu chỉ báo lỗi hiện tại
void PyErr_NormalizeException[ **exc, **val, **tb]Part of the .
Trong một số trường hợp nhất định, các giá trị được trả về bên dưới có thể là "không chuẩn hóa", nghĩa là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }10 là một đối tượng lớp nhưng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }11 không phải là một thể hiệ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, không có gì xảy ra. Việc chuẩn hóa bị trì hoãn được thực hiện để cải thiện hiệu suất
Ghi chú
Hàm này không ngầm đặt thuộc tính
if [tb != NULL] { PyException_SetTraceback[val, tb]; }12 trên giá trị ngoại lệ. Nếu muốn đặt truy ngược thích hợp, cần có đoạn mã bổ sung sau
if [tb != NULL] { PyException_SetTraceback[val, tb]; }*PyErr_GetHandledException[void]
Part of the since version 3.11.
Truy xuất phiên bản ngoại lệ đang hoạt động, như sẽ được trả về bởi. Điều này đề cập đến một ngoại lệ đã bị bắt, không phải là một ngoại lệ mới được đưa ra. Trả về một tham chiếu mới cho ngoại lệ hoặc
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Không sửa đổi trạng thái ngoại lệ của trình thông dịch
Ghi chú
Chức năng này thường không được sử dụng bởi mã muốn xử lý ngoại lệ. Thay vào đó, nó có thể được sử dụng khi mã cần lưu và khôi phục trạng thái ngoại lệ tạm thời. Sử dụng để khôi phục hoặc xóa trạng thái ngoại lệ
Mới trong phiên bản 3. 11
void PyErr_SetHandledException[ *exc]Part of the since version 3.11.
Đặt ngoại lệ đang hoạt động, như đã biết từ
if [tb != NULL] { PyException_SetTraceback[val, tb]; }13. Điều này đề cập đến một ngoại lệ đã bị bắt, không phải là một ngoại lệ mới được đưa ra. Để xóa trạng thái ngoại lệ, vượt qua
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3
Ghi chú
Chức năng này thường không được sử dụng bởi mã muốn xử lý ngoại lệ. Thay vào đó, nó có thể được sử dụng khi mã cần lưu và khôi phục trạng thái ngoại lệ tạm thời. Sử dụng để có được trạng thái ngoại lệ
Mới trong phiên bản 3. 11
void PyErr_GetExcInfo[ **ptype, **pvalue, **ptraceback]Part of the since version 3.7.
Truy xuất biểu diễn kiểu cũ của thông tin ngoại lệ, như đã biết từ. Điều này đề cập đến một ngoại lệ đã bị bắt, không phải là một ngoại lệ mới được đưa 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à
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Không sửa đổi trạng thái thông tin ngoại lệ. Chức năng này được giữ để tương thích ngược. thích sử dụng
Ghi chú
Chức năng này thường không được sử dụng bởi mã muốn xử lý ngoại lệ. Thay vào đó, nó có thể được sử dụng khi mã cần lưu và khôi phục trạng thái ngoại lệ tạm thời. Sử dụng để khôi phục hoặc xóa trạng thái ngoại lệ
Mới trong phiên bản 3. 3
void PyErr_SetExcInfo[ *loại, *value, *traceback]Part of the since version 3.7.
Đặt thông tin ngoại lệ, như đã biết từ
if [tb != NULL] { PyException_SetTraceback[val, tb]; }1. Điều này đề cập đến một ngoại lệ đã bị bắt, không phải là một ngoại lệ mới được đưa 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ệ, hãy vượt qua
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 cho cả ba đối số. Chức năng này được giữ để tương thích ngược. thích sử dụng
Ghi chú
Chức năng này thường không được sử dụng bởi mã muốn xử lý ngoại lệ. Thay vào đó, nó có thể được sử dụng khi mã cần lưu và khôi phục trạng thái ngoại lệ tạm thời. Sử dụng để đọc trạng thái ngoại lệ
Mới trong phiên bản 3. 3
Đã thay đổi trong phiên bản 3. 11. Các đối số
if [tb != NULL] { PyException_SetTraceback[val, tb]; }27 và
if [tb != NULL] { PyException_SetTraceback[val, tb]; }28 không còn được sử dụng nữa và có thể là NULL. Trình thông dịch hiện lấy chúng từ trường hợp ngoại lệ [đối số
if [tb != NULL] { PyException_SetTraceback[val, tb]; }29]. Hàm vẫn đánh cắp tham chiếu của cả ba đối số.
Xử lý tín hiệu
int PyErr_CheckSignals[]Một phần của.
Chức năng này tương tác với xử lý tín hiệu của Python
Nếu hàm được gọi từ luồng chính và bên dưới trình thông dịch Python chính, nó sẽ kiểm tra xem tín hiệu đã được gửi đến các quy trình hay chưa và nếu có, hãy gọi trình xử lý tín hiệu tương ứng. Nếu mô-đun được hỗ trợ, điều này có thể gọi trình xử lý tín hiệu được viết bằng Python
Hàm cố gắng xử lý tất cả các tín hiệu đang chờ xử lý, sau đó trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7. Tuy nhiên, nếu trình xử lý tín hiệu Python đưa ra một ngoại lệ, chỉ báo lỗi sẽ được đặt và hàm trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 ngay lập tức [do đó, các tín hiệu đang chờ xử lý khác có thể chưa được xử lý. họ sẽ có trong lần gọi tiếp theo]
Nếu hàm được gọi từ một luồng không phải luồng chính hoặc dưới trình thông dịch Python không chính, thì hàm này không thực hiện gì và trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7
Chức năng này có thể được gọi bằng mã C chạy dài muốn bị gián đoạn bởi yêu cầu của người dùng [chẳng hạn như bằng cách nhấn Ctrl-C]
Ghi chú
Trình xử lý tín hiệu Python mặc định cho
if [tb != NULL] { PyException_SetTraceback[val, tb]; }35 đưa ra ngoại lệvoid PyErr_SetInterrupt[]
Một phần của.
Mô phỏng tác động của tín hiệu
if [tb != NULL] { PyException_SetTraceback[val, tb]; }35 đến. Điều này tương đương với
if [tb != NULL] { PyException_SetTraceback[val, tb]; }38
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 và từ bộ xử lý tín hiệu C
int PyErr_SetInterruptEx[int signum]Part of the since version 3.10.
Mô phỏng hiệu ứng của tín hiệu đến. Lần gọi tiếp theo, trình xử lý tín hiệu Python cho số tín hiệu đã cho sẽ được gọi
Chức năng này có thể được gọi bằng mã C thiết lập xử lý tín hiệu của riêng nó và muốn các trình xử lý tín hiệu Python được gọi như mong đợi khi có yêu cầu ngắt [ví dụ: khi người dùng nhấn Ctrl-C để ngắt một thao tác]
Nếu tín hiệu đã cho không được xử lý bởi Python [nó được đặt thành hoặc ], nó sẽ bị bỏ qua
Nếu signum nằm ngoài phạm vi cho phép của số signal, thì
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 được trả về. Mặt khác,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 được trả lại. Chỉ báo lỗi không bao giờ bị 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 và từ bộ xử lý tín hiệu C
Mới trong phiên bản 3. 10
int PySignal_SetWakeupFd[int fd]This utility function specifies a file descriptor to which the signal number is written as a single byte whenever a signal is received. fd must be non-blocking. It returns the previous such file descriptor.
Giá trị
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 tắt tính năng này; . Điều này tương đương với trong Python, nhưng không có bất kỳ lỗi nào khi kiểm tra. fd phải là một bộ mô tả tệp hợp lệ. Chức năng chỉ nên được gọi từ chủ đề 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ợ tay cầm ổ cắm.
Các lớp ngoại lệ
*PyErr_NewException[const char *name, *base, *dict]Return value: New reference. Part of the .
Hàm tiện ích này tạo và trả về một lớp ngoại lệ mới. Đối số tên phải là tên của ngoại lệ mới, một chuỗi C có dạng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }46. Các đối số cơ sở và dict thường là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Điều này tạo ra một đối tượng lớp có nguồn gốc từ [có thể truy cập trong C dưới dạng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }35]
Thuộc tính
if [tb != NULL] { PyException_SetTraceback[val, tb]; }50 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ố tên 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ố cơ sở có thể được sử dụng để chỉ định các lớp cơ sở thay thế; . Đối số dict có thể được sử dụng để chỉ định một từ điển các biến và phương thức của lớp *PyErr_NewExceptionWithDoc[const char *name, const char *doc, *base, *dict]
Return value: New reference. Part of the .
Giống như , ngoại trừ lớp ngoại lệ mới có thể dễ dàng được cung cấp một chuỗi tài liệu. Nếu tài liệu không phải là ____33, nó sẽ được sử dụng làm chuỗi tài liệu cho lớp ngoại lệ
Mới trong phiên bản 3. 2
Đối tượng ngoại lệ
*PyException_GetTraceback[ *ex]Return value: New reference. Part of the .
Trả lại truy nguyê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 cho đến
if [tb != NULL] { PyException_SetTraceback[val, tb]; }12. Nếu không có dấu vết liên quan, điều này sẽ trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3int PyException_SetTraceback[ *ex, *tb]
Part of the .
Đặt truy nguyên được liên kết với ngoại lệ thành tb. Sử dụng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }55 để xóa nó *PyException_GetContext[ *ex]
Return value: New reference. Part of the .
Trả về ngữ cảnh [một trường hợp ngoại lệ khác trong quá trình xử lý cũ đã được nêu ra] được liên kết với ngoại lệ dưới dạng tham chiếu mới, có thể truy cập từ Python đến
if [tb != NULL] { PyException_SetTraceback[val, tb]; }56. Nếu không có ngữ cảnh liên quan, điều này trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3void PyException_SetContext[ *ex, *ctx]
Part of the .
Đặt bối cảnh được liên kết với ngoại lệ thành ctx. Sử dụng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 để xóa nó. Không có loại kiểm tra để đả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 *PyException_GetCause[ *ex]
Return value: New reference. Part of the .
Trả về nguyên nhân [có thể là trường hợp ngoại lệ hoặc , được đặt bởi
if [tb != NULL] { PyException_SetTraceback[val, tb]; }60] đượ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 đến
if [tb != NULL] { PyException_SetTraceback[val, tb]; }61void PyException_SetCause[ *ex, *cause]
Part of the .
Đặt nguyên nhân liên quan đến ngoại lệ thành nguyên nhân. Sử dụng
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3 để xóa nó. Không có loại kiểm tra để đảm bảo rằng nguyên nhân là một trường hợp ngoại lệ hoặc. Điều này đánh cắp một tài liệu tham khảo để gây ra
if [tb != NULL] { PyException_SetTraceback[val, tb]; }64 được đặt hoàn toàn thành
if [tb != NULL] { PyException_SetTraceback[val, tb]; }65 bởi chức năng này
Đối tượng ngoại lệ Unicode
Các chức năng sau được sử dụng để tạo và sửa đổi các ngoại lệ Unicode từ C
*PyUnicodeDecodeError_Create[const char *encoding, const char *object, length, start, end, const char *reason]Return value: New reference. Part of the .
Tạo một đối tượng với các thuộc tính mã hóa, đối tượng, độ dài, bắt đầu, kết thúc và lý do. mã hóa và lý do là các chuỗi được mã hóa UTF-8
*PyUnicodeDecodeError_GetEncoding[ *exc]*PyUnicodeEncodeError_GetEncoding[ *exc]
Return value: New reference. Part of the .
Trả về thuộc tính mã hóa của đối tượng ngoại lệ đã cho
*PyUnicodeDecodeError_GetObject[ *exc]*PyUnicodeEncodeError_GetObject[ *exc]
*PyUnicodeTranslateError_GetObject[ *exc]
Return value: New reference. Part of the .
Trả về thuộc tính đối tượng của đối tượng ngoại lệ đã cho
int PyUnicodeDecodeError_GetStart[ *exc, *start]int PyUnicodeEncodeError_GetStart[ *exc, *start]
int PyUnicodeTranslateError_GetStart[ *exc, *start]
Part of the .
Lấy thuộc tính bắt đầu của đối tượng ngoại lệ đã cho và đặt nó vào *start. bắt đầu không được là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 nếu thành công,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 nếu thất bạiint PyUnicodeDecodeError_SetStart[ *exc, start]
int PyUnicodeEncodeError_SetStart[ *exc, start]
int PyUnicodeTranslateError_SetStart[ *exc, start]
Part of the .
Đặt thuộc tính bắt đầu của đối tượng ngoại lệ đã cho để bắt đầu. Trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 nếu thành công,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 nếu thất bạiint PyUnicodeDecodeError_GetEnd[ *exc, *end]
int PyUnicodeEncodeError_GetEnd[ *exc, *end]
int PyUnicodeTranslateError_GetEnd[ *exc, *end]
Part of the .
Lấy thuộc tính end của đối tượng ngoại lệ đã cho và đặt nó vào *end. kết thúc không được là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3. Trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 nếu thành công,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 nếu thất bạiint PyUnicodeDecodeError_SetEnd[ *exc, end]
int PyUnicodeEncodeError_SetEnd[ *exc, end]
int PyUnicodeTranslateError_SetEnd[ *exc, end]
Part of the .
Đặt thuộc tính end của đối tượng ngoại lệ đã cho thành end. Trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 nếu thành công,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 nếu thất bại *PyUnicodeDecodeError_GetReason[ *exc]
*PyUnicodeEncodeError_GetReason[ *exc]
*PyUnicodeTranslateError_GetReason[ *exc]
Return value: New reference. Part of the .
Trả về thuộc tính lý do của đối tượng ngoại lệ đã cho
int PyUnicodeDecodeError_SetReason[ *exc, const char *reason]int PyUnicodeEncodeError_SetReason[ *exc, const char *reason]
int PyUnicodeTranslateError_SetReason[ *exc, const char *reason]
Part of the .
Đặt thuộc tính lý do của đối tượng ngoại lệ đã cho thành lý do. Trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }7 nếu thành công,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }4 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 cuộc 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ì chúng đảm nhiệm việc xử lý đệ quy
int Py_EnterRecursiveCall[const char *where]Part of the since version 3.9.
Đánh dấu một điểm mà một cuộc gọi cấp C đệ quy sắp được thực hiện
Nếu
if [tb != NULL] { PyException_SetTraceback[val, tb]; }79 được xác định, chức năng này sẽ kiểm tra xem ngăn xếp hệ điều hành có bị tràn hay không bằng cách sử dụng. Trong trường hợp này, nó đặt a và trả về giá trị khác không
Sau đó, hàm sẽ kiểm tra xem có đạt đến giới hạn đệ quy không. Nếu trường hợp này xảy ra, a được đặt và giá trị khác 0 được trả về. Nếu không, số không được trả về
trong đó phải là một chuỗi được mã hóa UTF-8, chẳng hạn như
if [tb != NULL] { PyException_SetTraceback[val, tb]; }83 để được nối với thông báo 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 API giới hạn.
void Py_LeaveRecursiveCall[void]Part of the since version 3.9.
kết thúc một. Phải được gọi một lần cho mỗi lần gọi thành công
Đã thay đổi trong phiên bản 3. 9. Chức năng này hiện cũng có sẵn trong API giới hạn.
Việc triển khai đú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, còn cần theo dõi các đối tượng để ngăn chặn chu kỳ. Hai chức năng sau hỗ trợ chức năng này. Thực tế, đây là những C tương đương với
int Py_ReprEnter[ *đối tượng]Part of the .
Được gọi khi bắt đầu thực hiện để phát hiện các 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 sẽ trả về một đối tượng chuỗi biểu thị một chu kỳ. Ví dụ, các đối tượng trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }93 và các đối tượng trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }95
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 thường trả về
if [tb != NULL] { PyException_SetTraceback[val, tb]; }3
Mặt khác, hàm trả về 0 và quá trình triển khai có thể tiếp tục bình thường
void Py_ReprLeave[ *đối tượng]Part of the .
kết thúc một. Phải được gọi một lần cho mỗi lần gọi trả về số không
Ngoại lệ tiêu chuẩn
Tất cả các ngoại lệ tiêu chuẩn của Python đều có sẵn dưới dạng biến toàn cục có tên là
if [tb != NULL] { PyException_SetTraceback[val, tb]; }201 theo sau là tên ngoại lệ Python. Chúng có loại * ; . Để đầy đủ, đây là tất cả các biến.
Tên C
Tên Python
ghi chú
if [tb != NULL] { PyException_SetTraceback[val, tb]; }202
if [tb != NULL] { PyException_SetTraceback[val, tb]; }35
if [tb != NULL] { PyException_SetTraceback[val, tb]; }206
if [tb != NULL] { PyException_SetTraceback[val, tb]; }208
if [tb != NULL] { PyException_SetTraceback[val, tb]; }210
if [tb != NULL] { PyException_SetTraceback[val, tb]; }212
if [tb != NULL] { PyException_SetTraceback[val, tb]; }214
if [tb != NULL] { PyException_SetTraceback[val, tb]; }216
if [tb != NULL] { PyException_SetTraceback[val, tb]; }218
if [tb != NULL] { PyException_SetTraceback[val, tb]; }220
if [tb != NULL] { PyException_SetTraceback[val, tb]; }222
if [tb != NULL] { PyException_SetTraceback[val, tb]; }224
if [tb != NULL] { PyException_SetTraceback[val, tb]; }226
if [tb != NULL] { PyException_SetTraceback[val, tb]; }228
if [tb != NULL] { PyException_SetTraceback[val, tb]; }230
if [tb != NULL] { PyException_SetTraceback[val, tb]; }232
if [tb != NULL] { PyException_SetTraceback[val, tb]; }234
if [tb != NULL] { PyException_SetTraceback[val, tb]; }236
if [tb != NULL] { PyException_SetTraceback[val, tb]; }238
if [tb != NULL] { PyException_SetTraceback[val, tb]; }240
if [tb != NULL] { PyException_SetTraceback[val, tb]; }242
if [tb != NULL] { PyException_SetTraceback[val, tb]; }244
if [tb != NULL] { PyException_SetTraceback[val, tb]; }246
if [tb != NULL] { PyException_SetTraceback[val, tb]; }248
if [tb != NULL] { PyException_SetTraceback[val, tb]; }250
if [tb != NULL] { PyException_SetTraceback[val, tb]; }252
if [tb != NULL] { PyException_SetTraceback[val, tb]; }254
if [tb != NULL] { PyException_SetTraceback[val, tb]; }256
if [tb != NULL] { PyException_SetTraceback[val, tb]; }258
if [tb != NULL] { PyException_SetTraceback[val, tb]; }260
if [tb != NULL] { PyException_SetTraceback[val, tb]; }262
if [tb != NULL] { PyException_SetTraceback[val, tb]; }264
if [tb != NULL] { PyException_SetTraceback[val, tb]; }266
if [tb != NULL] { PyException_SetTraceback[val, tb]; }268
if [tb != NULL] { PyException_SetTraceback[val, tb]; }270
if [tb != NULL] { PyException_SetTraceback[val, tb]; }272
if [tb != NULL] { PyException_SetTraceback[val, tb]; }274
if [tb != NULL] { PyException_SetTraceback[val, tb]; }24
if [tb != NULL] { PyException_SetTraceback[val, tb]; }278
if [tb != NULL] { PyException_SetTraceback[val, tb]; }280
if [tb != NULL] { PyException_SetTraceback[val, tb]; }282
if [tb != NULL] { PyException_SetTraceback[val, tb]; }284
if [tb != NULL] { PyException_SetTraceback[val, tb]; }286
if [tb != NULL] { PyException_SetTraceback[val, tb]; }288
if [tb != NULL] { PyException_SetTraceback[val, tb]; }290
if [tb != NULL] { PyException_SetTraceback[val, tb]; }292
if [tb != NULL] { PyException_SetTraceback[val, tb]; }294
if [tb != NULL] { PyException_SetTraceback[val, tb]; }296
if [tb != NULL] { PyException_SetTraceback[val, tb]; }298
if [tb != NULL] { PyException_SetTraceback[val, tb]; }300
if [tb != NULL] { PyException_SetTraceback[val, tb]; }302
if [tb != NULL] { PyException_SetTraceback[val, tb]; }304
if [tb != NULL] { PyException_SetTraceback[val, tb]; }306
Mới trong phiên bản 3. 3. ______3212,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }214,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }218,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }222,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }220,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }224,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }226,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }230,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }232,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }244,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }246,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }260,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }268,
if [tb != NULL] { PyException_SetTraceback[val, tb]; }270 và
if [tb != NULL] { PyException_SetTraceback[val, tb]; }290 đã được giới thiệu sau PEP 3151.
Mới trong phiên bản 3. 5. ______3278 và
if [tb != NULL] { PyException_SetTraceback[val, tb]; }272.
Mới trong phiên bản 3. 6. ______3256.
Đây là những bí danh tương thích với
if [tb != NULL] { PyException_SetTraceback[val, tb]; }264
Tên C
ghi chú
if [tb != NULL] { PyException_SetTraceback[val, tb]; }327
if [tb != NULL] { PyException_SetTraceback[val, tb]; }328
if [tb != NULL] { PyException_SetTraceback[val, tb]; }329
Đã thay đổi trong phiên bản 3. 3. Các bí danh này từng là các loại ngoại lệ riêng biệt.
ghi chú
1[,,,,]Đây là một lớp cơ sở cho các ngoại lệ tiêu chuẩn khác
Chỉ được xác định trên Windows;