Hướng dẫn errors=ignore python - lỗi = bỏ qua python

Bạn không thể xác định lại các phương thức trên các loại tích hợp và bạn không thể thay đổi giá trị mặc định của tham số

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
8 thành
import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
9. Có nhiều cách khác để đạt được hành vi mong muốn, mặc dù.

Cách đẹp hơn một chút: Xác định chức năng

>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
0 của riêng bạn: Define your own
>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
0 function:

def decode(s, encoding="ascii", errors="ignore"):
    return s.decode(encoding=encoding, errors=errors)

Bây giờ, bạn sẽ cần phải gọi

>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
1 thay vì
>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
2, nhưng điều đó không quá tệ, phải không?

Hack: Bạn không thể thay đổi giá trị mặc định của tham số

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
8, nhưng bạn có thể ghi đè lên những gì trình xử lý cho mặc định
>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
4 làm:
You can't change the default value of the
import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
8 parameter, but you can overwrite what the handler for the default
>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
4 does:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)

Điều này về cơ bản sẽ thay đổi hành vi của

>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
4 thành hành vi
>>> while True print('Hello world')
  File "", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
6 tiêu chuẩn. Lưu ý rằng đây sẽ là một thay đổi toàn cầu, ảnh hưởng đến tất cả các mô -đun bạn nhập.

Tôi không đề nghị cả hai cách này. Giải pháp thực sự là để có được mã hóa của bạn đúng. (Tôi nhận thức rõ rằng điều này không phải lúc nào cũng có thể.)

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ụ 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ệ.

8.1. 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ó lẽ là loại khiếu nại phổ biến nhất mà bạn nhận được trong khi bạn vẫn đang học Python:

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

Trình 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 được gây ra bởi (hoặc ít nhất là được phát hiện tại) mã thông báo trước mũi tên: trong ví dụ, lỗi được phát hiện ở hàm in (), vì một dấu hai chấm (':') bị thiếu trước khi nó. Tên tệp và số dòng được in để bạn biết nơi để xem trong trường hợp đầu vào đến từ một tập lệnh.print(), since a colon (':') is missing before it. File name and line number are printed so you know where to look in case the input came from a script.

8.2. Ngoại lệ ha

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 hiện được gọi là ngoại lệ và không gây 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't convert 'int' object to str implicitly

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 in như một phần của thông báo: các loại trong ví dụ là ZerodivisionError, NameError và typeError. Chuỗi được in dưới dạng loại ngoại lệ là tên của ngoại lệ tích hợp xảy ra. Điều này đúng với tất cả các trường hợp ngoại lệ tích hợp, nhưng không cần phải đúng đối với các ngoại lệ do người dùng xác định (mặc dù đó là một quy ước hữu ích). Tên ngoại lệ tiêu chuẩn là số nhận dạng tích hợp (không dành riêng từ khóa).ZeroDivisionError, NameError and TypeError. The string printed as the exception type is the name of the built-in exception that occurred. This is true for all built-in exceptions, but need not be true for user-defined exceptions (although it is a useful convention). Standard exception names are built-in identifiers (not reserved keywords).

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.

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ệ của bàn phím.Control-C or whatever the operating system supports); note that a user-generated interruption is signalled by raising the KeyboardInterrupt exception.

>>> 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ố thử hoạt động như sau.try statement works as follows.

  • Đầu tiên, mệnh đề thử (câu lệnh giữa thử và ngoại trừ từ khóa) được thực thi.try and except keywords) is executed.
  • 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.try statement is finished.
  • 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. Sau đó, nếu loại của nó phù hợp với ngoại lệ được đặt theo tên ngoại trừ, mệnh đề ngoại trừ được thực thi và sau đó thực thi tiếp tục sau câu lệnh thử.except keyword, the except clause is executed, and then execution continues after the try statement.
  • 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 thử 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.try statements; if no handler is found, it is an unhandled exception and execution stops with a message as shown above.

Một câu lệnh thử 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 thử. 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ụ:try statement may have more than one except clause, to specify handlers for different exceptions. At most one handler will be executed. Handlers only handle exceptions that occur in the corresponding try clause, not in other handlers of the same try statement. An except clause may name multiple exceptions as a parenthesized tuple, for example:

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

Điều khoản ngoại trừ cuối cùng có thể bỏ qua (các) tên ngoại lệ, để 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 IOError as err:
    print("I/O error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

Việc thử ... ngoại trừ câu lệnh có một mệnh đề tùy chọn khác, 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ụ:try ... except statement has an optional else clause, which, when present, must follow all except clauses. It is useful for code that must be executed if the try clause does not raise an exception. For example:

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

Việc sử dụng mệnh đề khác tốt hơn so với việc thêm mã bổ sung vào mệnh đề thử vì nó tránh được vô tình bắt được một ngoại lệ đã được nêu ra bởi mã được bảo vệ bởi ... ngoại trừ câu lệnh.else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try ... except statement.

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 thể hiện ngoại lệ với các đối số được lưu trữ trong ví dụ.args. Để thuận tiện, trường hợp ngoại lệ xác định __STR __ () để các đối số có thể được in trực tiếp mà không phải tham khảo .args. 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.instance.args. For convenience, the exception instance defines __str__() so the arguments can be printed directly without having to reference .args. One may also instantiate an exception first before raising it and add any attributes to it as desired.

>>> 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: int division or modulo by zero

8.4. Tăng ngoại lệ

Tuyên bố Raise 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 statement allows the programmer to force a specified exception to occur. For example:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
0

Đối số duy nhất để nâng cao cho thấy 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 xuất phát từ ngoại lệ).raise indicates the exception to be raised. This must be either an exception instance or an exception class (a class that derives from Exception).

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 RAISE cho phép bạn đưa ra ngoại lệ:raise statement allows you to re-raise the exception:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
1

8,5. 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 ngoại lệ, trực tiếp hoặc gián tiếp. Ví dụ:Exception class, either directly or indirectly. For example:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
2

Trong ví dụ này, mặc định __init __ () ngoại lệ đã bị ghi đè. Hành vi mới chỉ đơn giản là tạo thuộc tính giá trị. Điều này thay thế hành vi mặc định của việc tạo thuộc tính Args.__init__() of Exception has been overridden. The new behavior simply creates the value attribute. This replaces the default behavior of creating the args attribute.

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ệ. Khi tạo một mô -đun có thể nêu ra một số lỗi riêng biệt, một thông lệ phổ biến là tạo một lớp cơ sở cho các ngoại lệ được xác định bởi mô -đun đó và lớp con để tạo các lớp ngoại lệ cụ thể cho các điều kiện lỗi khác nhau:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
3

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.

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

Câu lệnh TRY 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 hiện trong mọi trường hợp. Ví dụ:try statement has another optional clause which is intended to define clean-up actions that must be executed under all circumstances. For example:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
4

Một mệnh đề cuối cùng luôn được thực thi trước khi rời khỏi câu lệnh thử, cho dù ngoại lệ có xảy ra hay không. Khi một ngoại lệ đã xảy ra trong mệnh đề thử và chưa được xử lý bởi một mệnh đề ngoại trừ (hoặc nó đã xảy ra trong một điều khoản ngoại trừ hoặc điều khoản khác), nó được nêu lại sau khi mệnh đề cuối cùng đã được thực thi. Điều khoản cuối cùng cũng được thực thi trên đường ra khỏi đường ra khi bất kỳ mệnh đề nào khác của câu lệnh thử được để lại thông qua một lần nghỉ, tiếp tục hoặc trả lời. Một ví dụ phức tạp hơn:try statement, whether an exception has occurred or not. When an exception has occurred in the try clause and has not been handled by an except clause (or it has occurred in a except or else clause), it is re-raised after the finally clause has been executed. The finally clause is also executed “on the way out” when any other clause of the try statement is left via a break, continue or return statement. A more complicated example:

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
5

Như bạn có thể thấy, mệnh đề cuối cùng được thực hiện trong mọi sự kiện. Kiểu mẫu được nâng lên bằng cách chia hai chuỗi không được xử lý bởi mệnh đề ngoại trừ và do đó được tăng lại sau khi mệnh đề cuối cùng đã được thực thi.finally clause is executed in any event. The TypeError raised by dividing two strings is not handled by the except clause and therefore re-raised after the finally clause has been executed.

Trong các ứng dụng trong thế giới thực, điều khoản cuối cùng 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.finally clause is useful for releasing external resources (such as files or network connections), regardless of whether the use of the resource was successful.

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

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
6

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. Tuyên bố với 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 làm sạch kịp thời và chính xác.with statement allows objects like files to be used in a way that ensures they are always cleaned up promptly and correctly.

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)
7

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