Hướng dẫn does python try require except? - python thử yêu cầu ngoại trừ?

Làm thế nào để bỏ qua các ngoại lệ đúng cách?

Có một số cách để làm điều này.

Tuy nhiên, sự lựa chọn của ví dụ có một giải pháp đơn giản không bao gồm trường hợp chung.

Cụ thể cho ví dụ:

Thay vì

try:
    shutil.rmtree(path)
except:
    pass

Làm cái này:

shutil.rmtree(path, ignore_errors=True)

Đây là một đối số cụ thể cho

shutil.rmtree(path, ignore_errors=True)
5. Bạn có thể thấy sự trợ giúp trên nó bằng cách thực hiện những điều sau đây và bạn cũng sẽ thấy nó cũng có thể cho phép chức năng về lỗi.

>>> import shutil
>>> help(shutil.rmtree)

Vì điều này chỉ bao gồm trường hợp hẹp của ví dụ, tôi sẽ chứng minh thêm cách xử lý điều này nếu các đối số từ khóa đó không tồn tại.

Cách tiếp cận chung

Vì những điều trên chỉ bao gồm trường hợp hẹp của ví dụ, tôi sẽ chứng minh thêm cách xử lý điều này nếu các đối số từ khóa đó không tồn tại.

Mới trong Python 3.4:

Bạn có thể nhập trình quản lý bối cảnh

shutil.rmtree(path, ignore_errors=True)
6:

from contextlib import suppress

Nhưng chỉ đàn áp ngoại lệ cụ thể nhất:

with suppress(FileNotFoundError):
    shutil.rmtree(path)

Bạn sẽ âm thầm bỏ qua một

shutil.rmtree(path, ignore_errors=True)
7:

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

Từ các tài liệu:

Như với bất kỳ cơ chế nào khác ngăn chặn hoàn toàn các ngoại lệ, người quản lý ngữ cảnh này chỉ nên được sử dụng để bao gồm các lỗi rất cụ thể trong đó âm thầm tiếp tục thực hiện chương trình được biết là điều cần làm.

Lưu ý rằng

shutil.rmtree(path, ignore_errors=True)
6 và
shutil.rmtree(path, ignore_errors=True)
7 chỉ có sẵn trong Python 3.

Nếu bạn cũng muốn mã của mình hoạt động trong Python 2, hãy xem phần tiếp theo:

Python 2 & 3:

Khi bạn chỉ muốn thử/ngoại trừ không xử lý ngoại lệ, làm thế nào để bạn làm điều đó trong Python?

Là cách sau đúng cách để làm điều đó?

try :
    shutil.rmtree ( path )
except :
    pass

Đối với mã tương thích Python 2,

>>> import shutil
>>> help(shutil.rmtree)
0 là cách chính xác để có một tuyên bố không có op. Nhưng khi bạn làm một cái trần
>>> import shutil
>>> help(shutil.rmtree)
1, điều đó cũng giống như làm
>>> import shutil
>>> help(shutil.rmtree)
2 bao gồm
>>> import shutil
>>> help(shutil.rmtree)
3,
>>> import shutil
>>> help(shutil.rmtree)
4 và
>>> import shutil
>>> help(shutil.rmtree)
5, và nói chung, bạn không muốn bắt những thứ đó.

Trong thực tế, bạn nên cụ thể trong việc đặt tên ngoại lệ nhất có thể.

Đây là một phần của hệ thống phân cấp ngoại lệ Python (2) và như bạn có thể thấy, nếu bạn bắt được các ngoại lệ chung hơn, bạn có thể che giấu các vấn đề mà bạn không mong đợi:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
... and so on

Bạn có thể muốn bắt một Oserror ở đây, và có lẽ ngoại lệ mà bạn không quan tâm là nếu không có thư mục.

Chúng ta có thể nhận được số lỗi cụ thể đó từ thư viện

>>> import shutil
>>> help(shutil.rmtree)
6 và reraise nếu chúng ta không có điều đó:

import errno

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno == errno.ENOENT: # no such file or directory
        pass
    else: # we had an OSError we didn't expect, so reraise it
        raise 

Lưu ý, một mức tăng trần làm tăng ngoại lệ ban đầu, đó có lẽ là những gì bạn muốn trong trường hợp này. Được viết chính xác hơn, vì chúng ta không thực sự cần phải rõ ràng

>>> import shutil
>>> help(shutil.rmtree)
0 với mã trong xử lý ngoại lệ:

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno != errno.ENOENT: # no such file or directory
        raise 

Sử dụng thử mà không ngoại trừ (bỏ qua các ngoại lệ) trong Python #

Sử dụng câu lệnh

>>> import shutil
>>> help(shutil.rmtree)
0 để sử dụng khối thử mà không có ngoại trừ. Tuyên bố
>>> import shutil
>>> help(shutil.rmtree)
0 không có gì và được sử dụng khi cần phải có câu lệnh theo cách cú pháp nhưng chương trình không yêu cầu hành động.

shutil.rmtree(path, ignore_errors=True)
0

Chúng tôi đã sử dụng một câu lệnh

>>> import shutil
>>> help(shutil.rmtree)
0 để bỏ qua một ngoại lệ.

Câu lệnh

from contextlib import suppress
1 trong ví dụ đầu tiên xử lý một ngoại lệ của bất kỳ loại nào.

Mã trong khối

from contextlib import suppress
2 có thể tăng bất kỳ ngoại lệ nào và nó sẽ được chuyển đến khối
from contextlib import suppress
1.

shutil.rmtree(path, ignore_errors=True)
1

Câu lệnh PASS không làm gì và được sử dụng khi bắt buộc phải có câu lệnh nhưng chương trình không yêu cầu hành động.

Nói chung, sử dụng tuyên bố

from contextlib import suppress
1 mà không chỉ định rõ ràng loại ngoại lệ được coi là một thực tiễn xấu.

Điều này chủ yếu là do việc bắt bất kỳ lỗi nào làm cho mã của bạn ít trực quan hơn và khó đọc hơn.

Một cách tiếp cận khác là phạm vi khối

from contextlib import suppress
1 đến một lỗi cụ thể.

shutil.rmtree(path, ignore_errors=True)
2

Khối

from contextlib import suppress
1 chỉ xử lý các ngoại lệ
from contextlib import suppress
7.

Nếu một ngoại lệ của bất kỳ loại nào khác được nâng lên, khối

from contextlib import suppress
1 sẽ không xử lý nó.

Ví dụ: mã sau đây tăng

from contextlib import suppress
9 trong khối
from contextlib import suppress
2 và làm hỏng chương trình.

shutil.rmtree(path, ignore_errors=True)
3

Bạn cũng có thể chỉ định nhiều lớp ngoại lệ trong khối

from contextlib import suppress
1.

shutil.rmtree(path, ignore_errors=True)
4

Khối

from contextlib import suppress
1 chạy vì nó xử lý
from contextlib import suppress
9 được nâng lên trong khối
from contextlib import suppress
2.

Nếu bạn phải chỉ định nhiều lớp ngoại lệ, hãy đảm bảo bọc chúng trong ngoặc đơn.

Bạn có thể xem tất cả các lớp ngoại lệ trong Python trong danh sách phân cấp ngoại lệ trong các tài liệu.

Bạn có cần ngoại trừ sau khi thử Python?

Hãy thử: Mã với (các) ngoại lệ để bắt. Nếu một ngoại lệ được nâng lên, nó sẽ nhảy thẳng vào khối ngoại trừ. Ngoại trừ: Mã này chỉ được thực thi nếu xảy ra ngoại lệ trong khối thử. Khối ngoại trừ được yêu cầu với một khối thử, ngay cả khi nó chỉ chứa câu lệnh PASS.The except block is required with a try block, even if it contains only the pass statement.

Có cần câu tuyên bố ngoại trừ không?

Ngoại trừ câu lệnh chạy mã theo câu lệnh của thử.Nếu mã này không thực thi thành công, chương trình sẽ dừng ở dòng gây ra lỗi và mã ngoại trừ mã sẽ chạy.Khối thử cho phép bạn kiểm tra một khối mã cho lỗi.. If this code does not execute successfully, the program will stop at the line that caused the error and the “except” code will run. The try block allows you to test a block of code for errors.

Chúng ta có thể sử dụng thử với ngoại trừ trong Python không?

Tuyên bố thử hoạt động như sau.Đầu tiên, mệnh đề thử (câu lệnh giữa thử và ngoại trừ từ khóa) được thực thi.Nếu không xảy ra ngoại lệ, mệnh đề trừ bị bỏ qua và thực hiện câu lệnh thử được kết thúc.Nếu một ngoại lệ xảy ra trong quá trình thực hiện mệnh đề thử, phần còn lại của mệnh đề sẽ bị bỏ qua.If no exception occurs, the except clause is skipped and execution of the try statement is finished. If an exception occurs during execution of the try clause, the rest of the clause is skipped.

Tôi có thể sử dụng gì thay vì thử ngoại trừ trong Python?

Nếu tình huống thỏa mãn các điều kiện trên, bạn không phải sử dụng thử ... ngoại trừ ... để xử lý các ngoại lệ.Thay vào đó, Bối cảnh thư viện tích hợp Python cung cấp một chức năng gọi là triệt tiêu để xử lý thanh lịch hơn.the Python built-in library contextlib provides a function called suppress to handle this more elegantly.