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
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.>>> import shutil
>>> help[shutil.rmtree]
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
1 trong ví dụ đầu tiên xử lý một ngoại lệ của bất kỳ loại nào.from contextlib import suppress
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]
1Câ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]
2Khố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]
3Bạ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]
4Khối
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.from contextlib import suppress
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.