Lỗi ngoại lệ trong python

Cho đến bây giờ các thông báo lỗi thiên đường đã được đề cập nhiều hơn, nhưng nếu bạn đã thử các ví dụ thì bạn có thể thấy một số. Có [ít nhất] hai loại lỗi có thể phân biệt. lỗi cú pháp và ngoại lệ

Nội dung chính Hiển thị

  • 8. 1. Lỗi cú pháp¶Lỗi cú pháp¶
  • 8. 2. Ngoại lệ haExceptions¶
  • 8. 3. Xử lý các trường hợp ngoại lệXử lý ngoại lệ¶
  • 8. 4. Tăng ngoại lệTăng ngoại lệ¶
  • 8,5. Chuỗi ngoại lệChuỗi ngoại lệ¶
  • 8. 6. Các trường hợp ngoại lệ do người dùng xác định Các ngoại lệ do người dùng xác định¶
  • 8. 7. Xác định các hành động dỡ bỏDefining Clean-up Actions¶
  • 8. 8. Undefault Actions đã được xác định trước Predefined Clean-up Actions¶
  • 8,9. Tăng và xử lý nhiều trường hợp ngoại lệ không liên quanTăng và xử lý nhiều trường hợp ngoại lệ không liên quan¶
  • 8. 10. Làm phong phú các ngoại lệ với Ghi chú JoLàm giàu ngoại lệ với Ghi chú¶
  • Ngoại lệ là một lỗi?
  • Ngoại lệ có phải là loại lỗi không?
  • 3 loại lỗi trong Python là gì?
  • Các loại lỗi trong Python là gì?

8. 1. Lỗi cú pháp¶Lỗi cú pháp¶

Lỗi cú pháp, còn được gọi là lỗi phân tích cú pháp, có thể là loại khiếu nại phổ biến nhất mà bạn nhận được khi bạn vẫn đang học Python

>>> while True print['Hello world']
  File "", line 1
    while True print['Hello world']
                   ^
SyntaxError: invalid syntax

Cú pháp phân tích cú pháp lặp lại dòng vi phạm và hiển thị một chút 'mũi tên chỉ vào điểm sớm nhất trong dòng phát hiện lỗi. Lỗi do [hoặc ít nhất là do AT] mã thông báo trước mũi tên. in ví dụ, error was phát hiện tại hàm

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
6, because a đại tràng [
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
7] is missing before it. File name and number lines are in to you know where to view in the field hợp đầu vào từ một lệnh tập tin

8. 2. Ngoại lệ haExceptions¶

Ngay cả khi một câu lệnh hoặc biểu thức là chính xác về mặt cú pháp, nó có thể gây ra lỗi khi một nỗ lực được thực hiện để thực hiện nó. Các lỗi được phát hiện trong quá trình thực thi được gọi là ngoại lệ và không gây ra tử vong vô điều kiện. bạn sẽ sớm học cách xử lý chúng trong các chương trình Python. Tuy nhiên, hầu hết các trường hợp ngoại lệ không được xử lý bởi các chương trình và dẫn đến các thông báo lỗi như được hiển thị ở đây

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str

Dòng cuối cùng của thông báo lỗi cho biết những gì đã xảy ra. Các ngoại lệ có các loại khác nhau và loại được đưa vào như một phần của thông báo. các loại trong ví dụ là

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
8,
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
9 và
... except [RuntimeError, TypeError, NameError]:
...     pass
0. The string are in under the exception type is the exceptions name is a valid rate. Điều này đúng với tất cả các trường hợp ngoại lệ hợp lệ, nhưng không nhất thiết phải đúng với các trường hợp ngoại lệ do người dùng xác định [mặc dù đó là một quy ước hữu ích]. The normal name out of standard is a numberNhận định dạng hợp lệ [không dành riêng cho từ khóa]

Phần còn lại của dòng cung cấp chi tiết dựa trên loại trừ và nguyên nhân gây ra nó

Phần trước của thông báo lỗi cho thấy cảnh báo ngoại lệ, dưới dạng một dấu vết ngăn xếp. Nói chung, nó chứa một dòng Nguồn liệt kê theo dõi ngăn xếp;

Các hợp lệ hợp lệ ngoại lệ liệt kê các hợp lệ hợp lệ ngoại lệ và ý nghĩa của chúng. liệt kê các ngoại lệ tích hợp và ý nghĩa của chúng.

8. 3. Xử lý các trường hợp ngoại lệXử lý ngoại lệ¶

Có thể viết các chương trình xử lý các ngoại lệ được chọn. Nhìn vào ví dụ sau, yêu cầu người dùng bắt đầu cho đến khi số nguyên hợp lệ đã được nhập, nhưng cho phép người dùng làm gián đoạn chương trình [sử dụng Control-C hoặc bất kỳ hệ điều hành hỗ trợ nào];

... except [RuntimeError, TypeError, NameError]:
...     pass
1.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...

Tuyên bố

... except [RuntimeError, TypeError, NameError]:
...     pass
2 active like after
  • Đầu tiên, mệnh đề thử [câu lệnh giữa các từ khóa

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2 và
    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    4] được thi
  • Nếu không có ngoại lệ, mệnh đề bị loại bỏ và thực hiện lệnh

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2 end
  • Nếu có ngoại lệ xảy ra trong quá trình thực hiện mệnh đề

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2, phần còn lại của mệnh đề sẽ bị loại bỏ. Sau đó, nếu loại của nó khớp với ngoại lệ được đặt theo tên của từ khóa
    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    4, mệnh đề ngoại trừ được thực thi và sau đó thực thi tiếp tục sau khi khối thử nghiệm/ngoại trừ
  • Nếu một ngoại lệ xảy ra không khớp với ngoại lệ có tên trong mệnh đề ngoại lệ, thì nó được chuyển sang câu lệnh

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2 bên ngoài;

One command

... except [RuntimeError, TypeError, NameError]:
...     pass
2 may ra co nhieu hon mot dieu kien ngoai doi, to only the process process that sieu nhan khac nhau. Nhiều nhất một người xử lý sẽ được thực thi. Người xử lý chỉ xử lý các tình huống ngoại lệ trong số mệnh đề thử tương ứng, chứ không phải trong các trình xử lý khác nhau của cùng một câu lệnh
... except [RuntimeError, TypeError, NameError]:
...     pass
2. Một vấn đề ngoại lệ có thể đặt tên cho nhiều mệnh lệnh ngoại lệ là một bộ phận được trích xuất đơn, ví dụ:.
... except [RuntimeError, TypeError, NameError]:
...     pass

Một lớp trong mệnh đề

... except [RuntimeError, TypeError, NameError]:
...     pass
4 tương thích với một ngoại lệ nếu đó là cùng một lớp hoặc một lớp cơ sở của chúng [nhưng không phải là cách khác - một định mệnh ngoại lệ trừ liệt kê một lớp dẫn đầu ra không tương thích với một lớp cơ sở]. Ví dụ. code after will in B, C, D theo thứ tự đó.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
0

Lưu ý rằng nếu các mệnh đề ngoại trừ bị đảo ngược [với

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
02 trước tiên], nó sẽ nằm trong B, B, B - trận đấu đầu tiên ngoại trừ mệnh đề được kích hoạt

Trong trường hợp ngoại lệ, nó có thể có các giá trị liên quan, còn được gọi là các đối số ngoại lệ. Sự hiện diện và các loại của các đối số phụ thuộc vào loại ngoại lệ

Mệnh đề ngoại lệ có thể chỉ định một biến sau tên ngoại lệ. Biến đổi được liên kết với khả năng ngoại lệ thông thường có thuộc tính

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
03 lưu trữ các đối số. Để thuận tiện, các ngoại lệ được đánh giá hợp lệ xác định
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
04 để tất cả các đối số không được truy cập rõ ràng
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
05.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
5

Đầu ra ngoại lệ ____ ____44 dưới dạng phần cuối [‘chi tiết] của thông báo cho các trường hợp ngoại lệ chưa được xử lý

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
07 là lớp cơ sở chung của tất cả các trường hợp ngoại lệ. Một trong những lớp con của nó,____108, là lớp cơ sở của tất cả các trường hợp ngoại lệ không gây tử vong. Các ngoại lệ không phải là các lớp con của ______108 thường không được xử lý, bởi vì chúng được sử dụng để chỉ ra rằng chương trình nên chấm dứt. Họ bao gồm
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
50 được nâng lên bởi
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
51 và
... except [RuntimeError, TypeError, NameError]:
...     pass
1 được nâng lên khi người dùng muốn làm gián đoạn chương trình.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
08 could be used as a character character đại diện bắt [gần như] mọi thứ. Tuy nhiên, đó là thực tế tốt là cụ thể nhất có thể với các ngoại lệ mà chúng tôi dự kiến ​​xử lý và cho phép bất kỳ trường hợp ngoại lệ bất ngờ nào truyền bá.

Phổ biến nhất mẫu để xử lý

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
08 is in or write off exception and after that đánh lại nó [cho phép người gọi cũng xử lý ngoại lệ].
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
4

Tuyên bố

... except [RuntimeError, TypeError, NameError]:
...     pass
2 ____ ____34 có một mệnh đề khác tùy chọn, mà khi có mặt, phải tuân theo tất cả ngoại trừ các điều khoản. Nó rất hữu ích cho mã phải được thực thi nếu số mệnh thử thách không tăng ngoại lệ. Ví dụ.
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
6

Việc sử dụng mệnh đề

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
57 tốt hơn so với việc thêm mã bổ sung vào mệnh đề
... except [RuntimeError, TypeError, NameError]:
...     pass
2 vì nó tránh vô tình bắt được một ngoại lệ đã được tăng lên bởi mã được bảo vệ bởi lệnh
... except [RuntimeError, TypeError, NameError]:
...     pass
2 ____ ____34

Người xử lý ngoại lệ không chỉ xử lý các trường hợp ngoại lệ xảy ra ngay lập tức định mệnh trong đề thử, mà cả những điều xảy ra bên trong các chức năng được gọi [thậm chí gián tiếp] trong đề thử. Ví dụ

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
0

8. 4. Tăng ngoại lệTăng ngoại lệ¶

Câu lệnh

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
41 cho phép lập trình viên buộc một ngoại lệ chỉ xảy ra. Ví dụ.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
2

The best number for

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
41 only out of a value is nêu ra. Đây phải là một ngoại lệ hoặc một lớp ngoại lệ [một lớp bắt nguồn từ
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
07, chẳng hạn như _
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
08 hoặc một trong các lớp con của nó]. Nếu một lớp ngoại lệ được thông qua, nó sẽ được khởi động lại bằng cách gọi hàm tạo của nó mà không có đối số.
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
0

Nếu bạn cần xác định xem một ngoại lệ đã được nêu ra nhưng không có ý định xử lý nó, một hình thức đơn giản hơn của câu lệnh

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
41 cho phép bạn đưa ra ngoại lệ.
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
1

8,5. Chuỗi ngoại lệChuỗi ngoại lệ¶

Nếu một ngoại lệ không được xử lý xảy ra bên trong phần

... except [RuntimeError, TypeError, NameError]:
...     pass
4, nó sẽ có ngoại lệ được xử lý gắn vào nó và được đưa vào thông báo lỗi

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
2

Để chỉ ra rằng một ngoại lệ là hậu quả trực tiếp của một điều khác, câu lệnh

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
41 cho phép một điều khoản_______348 tùy chọn.
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
3

Điều này có thể hữu ích khi bạn đang chuyển đổi các ngoại lệ. Ví dụ

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
4

Nó cũng cho phép chuỗi vô hiệu hóa ngoại lệ tự động bằng thành ngữ

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
49.
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
5

Để biết thêm thông tin về chuỗi cơ học, hãy xem các hợp lệ ngoại lệ. Ngoại lệ tích hợp sẵn .

8. 6. Các trường hợp ngoại lệ do người dùng xác định Các ngoại lệ do người dùng xác định¶

Các chương trình có thể đặt tên cho các trường hợp lệ ngoại lệ của riêng họ bằng cách tạo một lớp ngoại lệ mới [xem các lớp để biết thêm về các lớp Python]. Các ngoại lệ thông thường nên được lấy từ lớp

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
08, trực tiếp hoặc gián tiếp. Lớp để biết thêm về các lớp Python]. Các ngoại lệ thường được bắt nguồn từ lớp_______108, trực tiếp hoặc gián tiếp.

Các lớp ngoại lệ có thể được xác định làm bất cứ điều gì mà bất kỳ lớp nào khác có thể làm, nhưng thường được giữ đơn giản, thường chỉ cung cấp một số thuộc tính cho phép thông tin về lỗi được trích xuất bởi người xử lý

Hầu hết các trường hợp ngoại lệ đã được xác định với các kết thúc tên trong Lỗi, tương tự như việc đặt tên cho các trường hợp ngoại lệ theo tiêu chuẩn

Nhiều mô-đun tiêu chuẩn xác định ngoại lệ của chính chúng để báo cáo các lỗi có thể xảy ra trong các chức năng mà chúng đã xác định

8. 7. Xác định các hành động dỡ bỏDefining Clean-up Actions¶

Tuyên bố

... except [RuntimeError, TypeError, NameError]:
...     pass
2 có một mệnh đề tùy chọn khác Xác định các hành động dọn dẹp phải được thực thi trong mọi trường hợp. Ví dụ.
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
6

Nếu một mệnh đề

________ 362 có mặt, mệnh đề ________ 362 sẽ được thi dưới dạng nhiệm vụ cuối cùng trước khi ra lệnh
... except [RuntimeError, TypeError, NameError]:
...     pass
2 hoàn thành. Điều khoản
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
62 chạy xem câu lệnh
... except [RuntimeError, TypeError, NameError]:
...     pass
2 có tạo ra một ngoại lệ hay không. Các quan điểm sau thảo luận về các trường hợp phức tạp hơn khi xảy ra ngoại lệ
  • Nếu có ngoại lệ xảy ra trong quá trình thực hiện mệnh đề

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2, ngoại lệ có thể được xử lý theo mệnh đề
    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    4. Nếu ngoại lệ không được xử lý bởi mệnh đề
    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    4, ngoại lệ sẽ được nêu lại sau khi mệnh đề
    >>> 10 * [1/0]
    Traceback [most recent call last]:
      File "", line 1, in 
    ZeroDivisionError: division by zero
    >>> 4 + spam*3
    Traceback [most recent call last]:
      File "", line 1, in 
    NameError: name 'spam' is not defined
    >>> '2' + 2
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: can only concatenate str [not "int"] to str
    
    62 đã được thực thi
  • Một ngoại lệ có thể xảy ra trong quá trình thực hiện một điều khoản

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    4 or____157. Một lần nữa, ngoại lệ được nêu lại sau khi mệnh đề
    >>> 10 * [1/0]
    Traceback [most recent call last]:
      File "", line 1, in 
    ZeroDivisionError: division by zero
    >>> 4 + spam*3
    Traceback [most recent call last]:
      File "", line 1, in 
    NameError: name 'spam' is not defined
    >>> '2' + 2
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: can only concatenate str [not "int"] to str
    
    62 đã được thực thi
  • Nếu mệnh đề

    _______ 362 thực hiện câu lệnh _______ 105,
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    06 hoặc
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    07, các ngoại lệ không được nêu lại
  • If command

    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2 đạt được mệnh lệnh
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    05,
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    06 hoặc
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    07, mệnh đề _______ 362 sẽ thực hiện ngay trước khi thực hiện mệnh lệnh
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    05,
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    06 hoặc
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    07
  • If an account

    >>> 10 * [1/0]
    Traceback [most recent call last]:
      File "", line 1, in 
    ZeroDivisionError: division by zero
    >>> 4 + spam*3
    Traceback [most recent call last]:
      File "", line 1, in 
    NameError: name 'spam' is not defined
    >>> '2' + 2
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: can only concatenate str [not "int"] to str
    
    62 bao gồm một câu lệnh
    >>> while True:
    ..     try:
    ..         x = int[input["Please enter a number: "]]
    ..         break
    ..     except ValueError:
    ..         print["Oops!  That was no valid number.  Try again..."]
    ...
    
    07, giá trị được trả lại sẽ là tiêu đề từ câu lệnh
    >>> 10 * [1/0]
    Traceback [most recent call last]:
      File "", line 1, in 
    ZeroDivisionError: division by zero
    >>> 4 + spam*3
    Traceback [most recent call last]:
      File "", line 1, in 
    NameError: name 'spam' is not defined
    >>> '2' + 2
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: can only concatenate str [not "int"] to str
    
    62 ____ ____87, chứ không phải giá trị từ câu lệnh
    ... except [RuntimeError, TypeError, NameError]:
    ...     pass
    
    2 ____ ____

Ví dụ

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
7

Một ví dụ phức tạp hơn

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
8

Như bạn có thể thấy, mệnh đề

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
62 được thực thi trong mọi sự kiện.
... except [RuntimeError, TypeError, NameError]:
...     pass
0 được nâng lên bằng cách chia hai chuỗi không được xử lý theo mệnh đề
... except [RuntimeError, TypeError, NameError]:
...     pass
4 và do đó được tăng trở lại sau khi mệnh đề
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
62 đã được thực thi

Trong các ứng dụng trong thế giới thực, mệnh đề

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
62 rất hữu ích để phát hành các tài nguyên bên ngoài [như tệp hoặc kết nối mạng], bất kể việc sử dụng tài nguyên có thành công hay không

8. 8. Undefault Actions đã được xác định trước Predefined Clean-up Actions¶

Một số đối tượng xác định các hành động làm sạch tiêu chuẩn sẽ được thực hiện khi các đối tượng không còn cần thiết, bất kể hoạt động sử dụng các đối tượng có thành công hay không. Nhìn vào ví dụ sau, cố gắng mở một tệp và trong nội dung của nó trên màn hình

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
9

Vấn đề với mã này là nó để mở tệp trong một khoảng thời gian không xác định sau khi phần mã này đã hoàn tất việc thực thi. Đây không phải là một vấn đề trong các tập lệnh đơn giản, nhưng có thể là một vấn đề cho các ứng dụng lớn hơn. Câu lệnh

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
07 cho phép các đối tượng như các tệp được sử dụng theo cách chắc chắn rằng chúng luôn được dọn dẹp kịp thời và chính xác.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
0

Sau khi câu lệnh được thực thi, tệp F luôn được đóng, ngay cả khi gặp sự cố trong khi xử lý các dòng. Các đối tượng, giống như các tệp, cung cấp các hành động làm sạch đã được xác định trước sẽ chỉ ra điều này trong tài liệu của họ

8,9. Tăng và xử lý nhiều trường hợp ngoại lệ không liên quanTăng và xử lý nhiều trường hợp ngoại lệ không liên quan¶

Có những vấn đề cần phải báo cáo một số ngoại lệ đã xảy ra. Đây thường là trường hợp trong các khung đồng thời, khi một số nhiệm vụ có thể thất bại trong bài hát, nhưng cũng có những trường hợp sử dụng khác trong đó mong muốn tiếp tục thực thi và thu thập nhiều lỗi thay vì tăng ngoại lệ

Blocking

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
08 kết thúc một danh sách các trường hợp ngoại lệ để chúng có thể được nâng cấp giống nhau. Đó là một ngoại lệ, vì vậy nó có thể bị bắt như bất kỳ ngoại lệ nào khác.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
1

Bằng cách sử dụng

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
09 thay vì
... except [RuntimeError, TypeError, NameError]:
...     pass
4, chúng ta chỉ có thể xử lý việc chọn lọc các ngoại lệ trong nhóm phù hợp với một loại định nghĩa nhất. Trong ví dụ sau, hiển thị một nhóm ngoại lệ lồng nhau, mỗi điều khoản
>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
09 trích xuất từ ​​các ngoại lệ của nhóm thuộc một loại định sẵn nhất trong khi cho phép tất cả các ngoại lệ khác tuyên truyền đến các mệnh đề khác và .
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
2

Lưu ý rằng các ngoại lệ lồng nhau trong một nhóm ngoại lệ phải là trường hợp, không phải loại. Điều này được thực hiện trong thực tế, các trường hợp ngoại lệ thông thường sẽ là những trường hợp đã được chương trình nâng cấp và bắt gặp, theo mô hình sau

>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
3

8. 10. Làm phong phú các ngoại lệ với Ghi chú JoLàm giàu ngoại lệ với Ghi chú¶

Khi một ngoại lệ được tạo ra để được nâng cấp, nó thường được khởi động với thông tin mô tả lỗi đã xảy ra. Có những trường hợp hữu ích để thêm thông tin sau khi ngoại lệ bị bắt. Với mục đích này, các ngoại lệ có một phương thức

>>> 10 * [1/0]
Traceback [most recent call last]:
  File "", line 1, in 
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback [most recent call last]:
  File "", line 1, in 
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: can only concatenate str [not "int"] to str
12 chấp nhận một chuỗi và thêm nó vào danh sách ghi chú ngoại lệ. Kết quả theo dõi tiêu chuẩn bao gồm tất cả các ghi chú, theo thứ tự chúng được thêm vào, sau ngoại lệ.
>>> while True:
..     try:
..         x = int[input["Please enter a number: "]]
..         break
..     except ValueError:
..         print["Oops!  That was no valid number.  Try again..."]
...
4

Ví dụ. khi thu thập các ngoại lệ thành một nhóm ngoại lệ, chúng tôi có thể muốn thêm thông tin cảnh báo cho các lỗi riêng lẻ. Trong các ngoại lệ sau đây trong nhóm có một ghi chú để biết khi nào lỗi này xảy ra

Chủ Đề