Hướng dẫn raise python - nuôi trăn

python Return trong Python Function trong Python Hàm trong Python

Nội dung chính ShowShow

  • Bài Viết Liên Quan
  • Toplist mới
  • Bài mới nhất
  • Chủ Đề
  • 8.1. Syntax Errors¶
  • 8.2. Exceptions¶
  • 8.3. Handling Exceptions¶
  • 8.4. Raising Exceptions¶
  • 8.5. Exception Chaining¶
  • 8.6. User-defined Exceptions¶
  • 8.7. Defining Clean-up Actions¶
  • 8.8. Predefined Clean-up Actions¶

Nội dung chính

  • Bài Viết Liên Quan
  • Toplist mới
  • Bài mới nhất
  • Chủ Đề
  • 8.1. Syntax Errors¶
  • 8.2. Exceptions¶
  • 8.3. Handling Exceptions¶
  • 8.4. Raising Exceptions¶
  • 8.5. Exception Chaining¶
  • 8.6. User-defined Exceptions¶
  • 8.7. Defining Clean-up Actions¶
  • 8.8. Predefined Clean-up Actions¶

Bài Viết Liên Quan

Nội dung chính
8.2. Exceptions¶
Hướng dẫn dùng numpy ln python
Hướng dẫn dùng matplotlib styles python
Hướng dẫn dùng python __all__ python
Hướng dẫn dùng python subarray python
Hướng dẫn dùng d.e.l python
Hướng dẫn dùng matlab scatterplot python
Hướng dẫn dùng .._.._...._ trong PHP
Hướng dẫn dùng python iterables python
Hướng dẫn thuật toán python
Hướng dẫn dùng true check python
Hướng dẫn python round up
Hướng dẫn dùng strx meaning python
Hướng dẫn dùng value def python
Hướng dẫn dùng regex string python
Hướng dẫn dùng pyspark.sql.types python
Hướng dẫn front-end python
Hướng dẫn dùng corr python python
Hướng dẫn dùng python -m python

Toplist mới

#1

Hướng dẫn dùng df mean python

Hướng dẫn dùng numpy pop python

#2

Top 10 bài tập nâng cao về cảm ứng từ 2022

Hướng dẫn dùng numpy pop python

#3

Top 10 bài tập nâng cao về cảm ứng từ 2022

6 ngày trước

#4

Top 10 vở bài tập tiếng việt lớp 3 tập 2 trang 50 2022

Top 9 cửa hàng bán đồ an vặt trung quốc tphcm 2022

#5

2 ngày trước

Top 9 công thức chỉnh màu lightroom tone xám 2022

#6

5 giờ trước

Top 9 bài 6 trang 37 sbt toán 7 tập 2 2022

#7

3 ngày trước

6 ngày trước

#8

Top 10 vở bài tập tiếng việt lớp 3 tập 2 trang 50 2022

Top 9 cửa hàng bán đồ an vặt trung quốc tphcm 2022

#9

2 ngày trước

Top 9 công thức chỉnh màu lightroom tone xám 2022

Bài mới nhất

5 giờ trước
Top 9 bài 6 trang 37 sbt toán 7 tập 2 2022
3 ngày trước
Top 10 muôn đội sâu các thế hệ người việt nam sẽ còn nhắc đến chiến thắng vĩ đại điện biên phủ như 2022
4 ngày trước
Top 9 bình đun nước fatz quick 6 2022
Top 10 kính công giáo đọc hằng ngày mp3 2022
18 giờ trước
Top 9 học phí cấp 3 trường công lập tphcm 2022
Cô giáo mần non lộ clip

Chủ Đề

light bulbing là gì - Nghĩa của từ light bulbing

When the auditor decides to select less than 100% of the population for testing the auditor is said to be using?

8.1. Syntax Errors¶

Mối quan hệ giữa đức và tài là gì

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

Phương pháp giải bài tập H+ NO3

8.2. Exceptions¶

Top 20 cửa hàng đt cũ Huyện Tu Mơ Rông Kon Tum 2022

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

What are the four common triggers of conflict spoken about in Chapter 6 choose the 4 that apply?

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

Phần trước của thông báo lỗi cho thấy bối cảnh xảy ra 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; Tuy nhiên, nó sẽ không hiển thị các dòng được đọc từ đầu vào tiêu chuẩn.

Các ngoại lệ tích hợp liệt kê các ngoại lệ tích hợp và ý nghĩa của chúng. lists the built-in exceptions and their meanings.

8.3. Xử lý các trường hợp 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 đầu vào 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 nào hỗ trợ); Lưu ý rằng một gián đoạn do người dùng tạo ra được báo hiệu bằng cách tăng 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...")
...
5.

>>> 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ố

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
6 hoạt động như sau.

  • Đầu tiên, mệnh đề thử (câu lệnh giữa các từ khóa

    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    6 và
    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    8) được thực thi.

  • Nếu không xảy ra ngoại lệ, mệnh đề trừ bị bỏ qua và thực thi 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...")
    ...
    
    6 đã hoàn thành.

  • Nếu một ngoại lệ xảy ra trong quá trình thực hiện mệnh đề

    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    6, phần còn lại của mệnh đề sẽ bị bỏ qua. 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
    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    8, mệnh đề ngoại trừ được thực thi và sau đó thực thi tiếp tục sau khi khối thử/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 trừ, nó sẽ được chuyển sang các 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...")
    ...
    
    6 bên ngoài; Nếu không tìm thấy người xử lý, đó là một ngoại lệ chưa được xử lý và thực thi sẽ dừng lại với một thông báo như được hiển thị ở trên.

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...")
...
6 có thể có nhiều hơn một điều khoản ngoại trừ mệnh đề, để chỉ định trình xử lý cho các ngoại lệ khác 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 ngoại lệ xảy ra trong mệnh đề thử tương ứng, không phải trong các trình xử lý khác của cùng 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...")
...
6. Một mệnh đề ngoại trừ có thể đặt tên cho nhiều trường hợp ngoại lệ là một bộ phận dấu ngoặc đơn, ví dụ:

... except (RuntimeError, TypeError, NameError):
...     pass

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

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
8 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 mệnh đề ngoại trừ liệt kê một lớp dẫn xuất không tương thích với một lớp cơ sở). Ví dụ: mã sau sẽ in B, C, D theo thứ tự đó:

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")

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

... except (RuntimeError, TypeError, NameError):
...     pass
6 trước tiên), nó sẽ được in B, B, B - lần khớp đầu tiên ngoại trừ mệnh đề được kích hoạt.

Tất cả các trường hợp ngoại lệ kế thừa từ

... except (RuntimeError, TypeError, NameError):
...     pass
7, và do đó nó có thể được sử dụng để phục vụ như một ký tự đại diện. Sử dụng điều này với sự thận trọng cực độ, vì thật dễ dàng để che giấu một lỗi lập trình thực sự theo cách này! Nó cũng có thể được sử dụng để in một thông báo lỗi và sau đó ghi lại ngoại lệ (cho phép người gọi cũng xử lý ngoại lệ):

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise

Ngoài ra, điều khoản ngoại trừ cuối cùng có thể bỏ qua (các) tên ngoại lệ, tuy nhiên giá trị ngoại lệ sau đó phải được lấy từ

... except (RuntimeError, TypeError, NameError):
...     pass
8.

Tuyên bố

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
6
>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
8 có một mệnh đề khác tùy chọn, 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 mệnh đề thử không tăng ngoại lệ. Ví dụ:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

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

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
1 tốt hơn so với việc thêm mã bổ sung vào mệnh đề
>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
6 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 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...")
...
6 ____ ____.

Khi một ngoại lệ xảy ra, nó có thể có một giá trị liên quan, còn được gọi là đối số ngoại lệ. Sự hiện diện và loại của đối số phụ thuộc vào loại ngoại lệ.

Mệnh đề ngoại trừ có thể chỉ định một biến sau tên ngoại lệ. Biến được liên kết với một trường hợp ngoại lệ với các đối số được lưu trữ trong

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
5. Để thuận tiện, trường hợp ngoại lệ xác định
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
6 để các đối số có thể được in trực tiếp mà không phải tham khảo
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
7. Người ta cũng có thể khởi tạo một ngoại lệ trước khi nâng nó và thêm bất kỳ thuộc tính nào cho nó như mong muốn.

>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print(type(inst))    # the exception instance
...     print(inst.args)     # arguments stored in .args
...     print(inst)          # __str__ allows args to be printed directly,
...                          # but may be overridden in exception subclasses
...     x, y = inst.args     # unpack args
...     print('x =', x)
...     print('y =', y)
...

('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

Nếu một ngoại lệ có các đối số, chúng được in là phần cuối cùng (‘chi tiết) của thông điệp cho các trường hợp ngoại lệ chưa được xử lý.

Người xử lý ngoại lệ don lồng chỉ xử lý các trường hợp ngoại lệ nếu chúng xảy ra ngay lập tức trong mệnh đề thử, nhưng cũng nếu chúng xảy ra bên trong các chức năng được gọi (thậm chí gián tiếp) trong mệnh đề thử. Ví dụ:

>>> def this_fails():
...     x = 1/0
...
>>> try:
...     this_fails()
... except ZeroDivisionError as err:
...     print('Handling run-time error:', err)
...
Handling run-time error: division by zero

8.4. Tăng ngoại lệ

Tuyên bố

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
8 cho phép lập trình viên buộc một ngoại lệ được chỉ định xảy ra. Ví dụ:

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "", line 1, in 
NameError: HiThere

Đối số duy nhất cho

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
8 chỉ ra ngoại lệ được nêu ra. Đây phải là một thể hiện ngoại lệ hoặc một lớp ngoại lệ (một lớp bắt nguồn từ
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
0). Nếu một lớp ngoại lệ được thông qua, nó sẽ được khởi tạo ngầm 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

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
8 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ệ

Tuyên bố

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
8 cho phép
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
3 tùy chọn cho phép các ngoại lệ chuỗi. 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
2

Đ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
3

Chuỗi ngoại lệ xảy ra tự động khi một ngoại lệ được nâng lên bên trong phần

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
8 hoặc
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5. Điều này có thể bị vô hiệu hóa bằng cách sử dụng thành ngữ
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
6:

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

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

8.6. Các trường hợp 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 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 nên được lấy từ lớp

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
0, trực tiếp hoặc gián tiếp.Classes for more about Python classes). Exceptions should typically be derived from the
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
0 class, either directly or indirectly.

Các lớp ngoại lệ có thể được xác định làm bất cứ điều gì 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ý cho ngoại lệ.

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

Nhiều mô -đun tiêu chuẩn xác định ngoại lệ của chính họ để 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. Thông tin thêm về các lớp được trình bày trong các lớp chương.Classes.

8.7. Xác định các hành động dọn dẹp

Tuyên bố

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
6 có một mệnh đề tùy chọn khác nhằm 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
5

Nếu một điều khoản

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5 có mặt, mệnh đề
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5 sẽ được thực thi dưới dạng nhiệm vụ cuối cùng trước khi 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...")
...
6 hoàn thành. Điều khoản
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5 chạy xem 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...")
...
6 có tạo ra một ngoại lệ hay không. Các đ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 một ngoại lệ xảy ra trong quá trình thực hiện mệnh đề

    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    6, ngoại lệ có thể được xử lý theo mệnh đề
    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    8. Nếu ngoại lệ không được xử lý bởi một mệnh đề
    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    8, ngoại lệ sẽ được nêu lại sau khi mệnh đề
    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except BaseException as err:
        print(f"Unexpected {err=}, {type(err)=}")
        raise
    
    5 đã đượ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

    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    ...
    
    8 hoặc
    class B(Exception):
        pass
    
    class C(B):
        pass
    
    class D(C):
        pass
    
    for cls in [B, C, D]:
        try:
            raise cls()
        except D:
            print("D")
        except C:
            print("C")
        except B:
            print("B")
    
    1. Một lần nữa, ngoại lệ được nêu lại sau khi mệnh đề
    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except BaseException as err:
        print(f"Unexpected {err=}, {type(err)=}")
        raise
    
    5 đã được thực thi.

  • Nếu mệnh đề

    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except BaseException as err:
        print(f"Unexpected {err=}, {type(err)=}")
        raise
    
    5 thực thi câu lệnh
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    2,
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    3 hoặc
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    4, các ngoại lệ không được nêu lại.

  • Nếu 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...")
    ...
    
    6 đạt đến câu lệnh
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    2,
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    3 hoặc
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    4, mệnh đề
    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except BaseException as err:
        print(f"Unexpected {err=}, {type(err)=}")
        raise
    
    5 sẽ thực thi ngay trước khi thực thi câu lệnh
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    2,
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    3 hoặc
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    4.

  • Nếu một điều khoản

    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except BaseException as err:
        print(f"Unexpected {err=}, {type(err)=}")
        raise
    
    5 bao gồm một câu lệnh
    >>> try:
    ...     raise Exception('spam', 'eggs')
    ... except Exception as inst:
    ...     print(type(inst))    # the exception instance
    ...     print(inst.args)     # arguments stored in .args
    ...     print(inst)          # __str__ allows args to be printed directly,
    ...                          # but may be overridden in exception subclasses
    ...     x, y = inst.args     # unpack args
    ...     print('x =', x)
    ...     print('y =', y)
    ...
    
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    4, giá trị được trả về sẽ là định đề từ câu lệnh
    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except BaseException as err:
        print(f"Unexpected {err=}, {type(err)=}")
        raise
    
    5 ____ ____ ____74, không phải là giá trị 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...")
    ...
    
    6 ____ ____.

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

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
7

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

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5 được thực thi trong mọi sự kiện.
>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
4 được nâng lên bằng cách chia hai chuỗi không được xử lý bởi mệnh đề
>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
8 và do đó được tăng lại sau khi mệnh đề
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5 đã được thực thi.

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

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except BaseException as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
5 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. Hành động dọn dẹp được xác định trước

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 đối tượng không còn cần thiết, bất kể hoạt động sử dụng đối tượng thành công hay không. Nhìn vào ví dụ sau, cố gắng mở một tệp và in nội dung của nó lê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
8

Vấn đề với mã này là nó để tệp mở trong một khoảng thời gian không xác định sau khi phần này của mã đã 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

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "", line 1, in 
NameError: HiThere
4 cho phép các đối tượng như các tệp được sử dụng theo cách đảm bảo chúng luôn được dọn sạch kịp thời và chính xá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
9

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ọ.