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 errno
. 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à NULL
nếu chúng được cho là trả về một con trỏ hoặc -1
nếu chúng trả về một số nguyên [ngoại lệ. 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ị của ngoại lệ và đối tượng truy nguyên. Bất kỳ con trỏ nào trong số đó có thể là _______33_______ 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 ngược _______33_______ nếu loại ngoại lệ là _______33_______]
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]một phần của
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]
một phần của
Gọi 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
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
errno
1Hà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ỏ NULL
để sử dụng trong câu lệnh errno
3
một phần của
Đâ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. errno
4. 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;
một phần của
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, ...]Giá trị trả về. Luôn NULL. một phần của
Hàm này đặt chỉ báo lỗi và trả về NULL
. 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
Giá trị trả về. Luôn NULL. Một phần của kể từ phiên bản 3. 5
Tương tự như , nhưng sử dụng đối số NULL
0 thay vì số lượng đối số thay đổi
Mới trong phiên bản 3. 5
void PyErr_SetNone[ *loại]một phần của
Đây là cách viết tắt của NULL
1
một phần của
Đây là cách viết tắt của NULL
2, trong đó thông báo chỉ ra rằng một thao tác 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ộ
Giá trị trả về. Luôn NULL. một phần của
Đây là cách viết tắt của NULL
3;
Giá trị trả về. Luôn NULL. một phần của
Đây là một chức năng thuận tiện để đư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 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ừ NULL
8], sau đó gọi NULL
9. Trên Unix, khi giá trị errno
là -1
1, 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ó ở mức đó. Hàm luôn trả về NULL
, do đó, hàm bao quanh lệnh gọi hệ thống có thể ghi -1
4 khi lệnh gọi hệ thống trả về lỗi
Giá trị trả về. Luôn NULL. một phần của
Tương tự như , với hành vi bổ sung là nếu tên tệpObject không phải là NULL
, 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 -1
8 của trường hợp ngoại lệ
Giá trị trả về. Luôn NULL. Một phần của kể từ phiên bản 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]Giá trị trả về. Luôn NULL. một phần của
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]Giá trị trả về. Luôn NULL. Một phần của Windows kể từ phiên bản 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à 0
, mã lỗi được trả về bởi lệnh gọi tới PyArg_*
3 sẽ được sử dụng thay thế. Nó gọi hàm Win32 PyArg_*
4 để truy xuất mô tả mã lỗi của Windows do ierr hoặc PyArg_*
3 cung cấp, sau đó, nó xây dựng một đối tượng tuple 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ừ PyArg_*
4], sau đó . Hàm này luôn trả về NULL
các cửa sổ
*PyErr_SetExcFromWindowsErr[ *loại, int ierr]Giá trị trả về. Luôn NULL. Một phần của Windows kể từ phiên bản 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]Giá trị trả về. Luôn NULL. Một phần của Windows kể từ phiên bản 3. 7
Tương tự như 1
0, 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]Giá trị trả về. Luôn NULL. Một phần của Windows kể từ phiên bản 3. 7
Tương tự như 1
0, với một tham số bổ sung chỉ định loại ngoại lệ sẽ được đưa ra
các cửa sổ
*PyErr_SetExcFromWindowsErrWithFilenameObjects[ *loại, int ierr, *filename, *filename2]Giá trị trả về. Luôn NULL. Một phần của Windows kể từ phiên bản 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]Giá trị trả về. Luôn NULL. Một phần của Windows kể từ phiên bản 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]Giá trị trả về. Luôn NULL. Một phần của kể từ phiên bản 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à NULL
, sẽ được đặt làm thuộc tính tương ứng của 1
8 và _1
9
Mới trong phiên bản 3. 3
*PyErr_SetImportErrorSubclass[ *ngoại lệ, *msg, *name, *path]Giá trị trả về. Luôn NULL. Một phần của kể từ phiên bản 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]Đặ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à a , thì nó sẽ đặt các thuộc tính bổ sung, làm cho hệ thống con in ngoại lệ nghĩ rằng ngoại lệ là một
Mới trong phiên bản 3. 4
void PyErr_SyntaxLocationEx[const char *filename, int lineno, int col_offset]Một phần của kể từ phiên bản 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]một phần của
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 0
6, 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à 0
nếu không có ngoại lệ nào được đưa ra hoặc -1
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]
một phần của
Đư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 NULL
; . 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.
Các danh mục cảnh báo phải là các phân lớp của NULL
3; . 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]Đưa ra thông báo cảnh báo với quyền 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; . Các đối số mô-đun và sổ đăng ký có thể được đặt thành NULL
để có được hiệu ứng mặc định được mô tả ở đó
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]một phần của
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 kể từ 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 NULL
6
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 NULL
7 hoặc tới ]. Nếu không được đặt, hãy trả lại NULL
. 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]một phần của
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;
một phần của
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]một phần của
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 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. Giá trị và đối tượng truy nguyên có thể là NULL
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]
một phần của
Đặ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à NULL
, chỉ báo lỗi sẽ bị xóa. Không chuyển một loại NULL
và giá trị không phải ______33_______ 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. tao đã cảnh cáo mày rồi. ]
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]một phần của
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]
Một phần của 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. Đ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 NULL
. 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]Một phần của kể từ phiên bản 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ệ, hãy vượt qua
NULL
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]Một phần của kể từ phiên bản 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à NULL
. 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]Một phần của kể từ phiên bản 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ệ, vượt qua
NULL
cho cả ba đối số. Chức năng này được giữ để tương thích ngược. thích sử dụngGhi 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ề 0
. Tuy nhiên, nếu trình xử lý tín hiệu Python đưa ra một ngoại lệ, thì chỉ báo lỗi được đặt và hàm trả về -1
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ề 0
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]Một phần của kể từ phiên bản 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ì -1
được trả về. Mặt khác, 0
đượ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]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 mỗi khi nhận được tín hiệu. fd phải không bị chặn. Nó trả về bộ mô tả tệp trước đó
Giá trị -1
vô hiệu hóa 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]Giá trị trả về. Tài liệu tham khảo mới. một phần của
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à chính tả thường là
NULL
. Đ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 NULL
5]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]
Giá trị trả về. Tài liệu tham khảo mới. một phần của
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 doc 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]Giá trị trả về. Tài liệu tham khảo mới. một phần của
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ề
NULL
int PyException_SetTraceback[ *ex, *tb]một phần của
Đặ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]
Giá trị trả về. Tài liệu tham khảo mới. một phần của
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 được từ Python thông qua
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ề
NULL
void PyException_SetContext[ *ex, *ctx]một phần của
Đặt bối cảnh được liên kết với ngoại lệ thành ctx. Sử dụng NULL
để 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
Giá trị trả về. Tài liệu tham khảo mới. một phần của
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 thông qua
if [tb != NULL] { PyException_SetTraceback[val, tb]; }61void PyException_SetCause[ *ex, *cause]
một phần của
Đặt nguyên nhân liên quan đến ngoại lệ thành nguyên nhân. Sử dụng NULL
để 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]Giá trị trả về. Tài liệu tham khảo mới. một phần của
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]
Giá trị trả về. Tài liệu tham khảo mới. một phần của
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]
Giá trị trả về. Tài liệu tham khảo mới. một phần của
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]
một phần của
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à NULL
. Trả về 0
khi thành công, -1
khi thất bại
int PyUnicodeEncodeError_SetStart[ *exc, start]
int PyUnicodeTranslateError_SetStart[ *exc, start]
một phần của
Đặt thuộc tính bắt đầu của đối tượng ngoại lệ đã cho để bắt đầu. Trả về 0
khi thành công, -1
khi thất bại
int PyUnicodeEncodeError_GetEnd[ *exc, *end]
int PyUnicodeTranslateError_GetEnd[ *exc, *end]
một phần của
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à NULL
. Trả về 0
khi thành công, -1
khi thất bại
int PyUnicodeEncodeError_SetEnd[ *exc, end]
int PyUnicodeTranslateError_SetEnd[ *exc, end]
một phần của
Đặt thuộc tính end của đối tượng ngoại lệ đã cho thành end. Trả về 0
khi thành công, -1
khi thất bại
*PyUnicodeEncodeError_GetReason[ *exc]
*PyUnicodeTranslateError_GetReason[ *exc]
Giá trị trả về. Tài liệu tham khảo mới. một phần của
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]
một phần của
Đặt thuộc tính lý do của đối tượng ngoại lệ đã cho thành lý do. Trả về 0
khi thành công, -1
khi 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]Một phần của kể từ phiên bản 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]Một phần của kể từ phiên bản 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]một phần của
Đượ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ề NULL
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]một phần của
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à errno
01 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ú
errno
02
NULL
5
errno
06
errno
08
errno
10
errno
12
errno
14
errno
16
errno
18
errno
20
errno
22
errno
24
errno
26
errno
28
errno
30
errno
32
errno
34
errno
36
errno
38
errno
40
errno
42
errno
44
errno
46
errno
48
errno
50
errno
52
errno
54
errno
56
errno
58
errno
60
errno
62
errno
64
errno
66
errno
68
errno
70
errno
72
errno
74
errno
4
errno
78
errno
80
errno
82
errno
84
errno
86
errno
88
errno
90
errno
92
errno
94
errno
96
errno
98
NULL
00
NULL
02
NULL
04
NULL
06
Mới trong phiên bản 3. 3. __errno
12, errno
14, errno
18, errno
22, errno
20, errno
24, errno
26, errno
30, errno
32, errno
44, errno
46, errno
60, errno
68, errno
32, errno
44, errno
46, errno
60, errno
68, errno
32, errno
70 và errno
3 được giới thiệu sau51_____EPP.
Mới trong phiên bản 3. 5. ______32_______78 và errno
72.
Mới trong phiên bản 3. 6. ______32_______56.
Đây là những bí danh tương thích với errno
64
Tên C
ghi chú
NULL
27
NULL
28
NULL
29
Đã 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;