Loại bỏ lỗi Python

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];
}
8

void 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 errno1

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ỏ NULL để sử dụng trong câu lệnh errno3

void PyErr_SetString[ *loại, const char *message]
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. errno4. 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]
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

*PyErr_FormatV[ *ngoại lệ, const char *format, va_list vargs]
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ố NULL0 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 NULL1

int PyErr_BadArgument[]
một phần của

Đây là cách viết tắt của NULL2, 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ộ

*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 NULL3;

*PyErr_SetFromErrno[ *loại]
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ừ NULL8], sau đó gọi NULL9. Trên Unix, khi giá trị errno-11, 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 -14 khi lệnh gọi hệ thống trả về lỗi

*PyErr_SetFromErrnoWithFilenameObject[ *loại, *filenameObject]
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 -18 của trường hợp ngoại lệ

*PyErr_SetFromErrnoWithFilenameObjects[ *loại, *filenameObject, *filenameObject2]
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ư 10, 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ư 10, 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 18 và _19

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 06, 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]

int PyErr_WarnEx[ *danh mục, const char *message, stack_level]
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 NULL3; . 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 NULL6

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 NULL7 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;

int PyErr_GivenExceptionMatches[ *đã cho, *exc]
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ụ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ề 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 NULL5]

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

*PyException_GetCause[ *ex]
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];
}
61

void 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 PyUnicodeDecodeError_SetStart[ *exc, start]
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 PyUnicodeDecodeError_GetEnd[ *exc, *end]
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 PyUnicodeDecodeError_SetEnd[ *exc, end]
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

*PyUnicodeDecodeError_GetReason[ *exc]
*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à errno01 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ú

errno02

NULL5

errno06

errno08

errno10

errno12

errno14

errno16

errno18

errno20

errno22

errno24

errno26

errno28

errno30

errno32

errno34

errno36

errno38

errno40

errno42

errno44

errno46

errno48

errno50

errno52

errno54

errno56

errno58

errno60

errno62

errno64

errno66

errno68

errno70

errno72

errno74

errno4

errno78

errno80

errno82

errno84

errno86

errno88

errno90

errno92

errno94

errno96

errno98

NULL00

NULL02

NULL04

NULL06

Mới trong phiên bản 3. 3. __errno12, errno14, errno18, errno22, errno20, errno24, errno26, errno30, errno32, errno44, errno46, errno60, errno68, errno32, errno44, errno46, errno60, errno68, errno32, errno70 và errno 3 được giới thiệu sau51_____EPP.

Mới trong phiên bản 3. 5. ______32_______78 và errno72.

Mới trong phiên bản 3. 6. ______32_______56.

Đây là những bí danh tương thích với errno64

Tên C

ghi chú

NULL27

NULL28

NULL29

Đã 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;

3 loại lỗi trong Python là gì?

Trong python có ba loại lỗi; . syntax errors, logic errors and exceptions.

Quá trình loại bỏ lỗi trong Python là gì?

Quá trình tìm và loại bỏ lỗi được gọi là gỡ lỗi .

Chủ Đề