Hướng dẫn valueerror python example - ví dụ về valueerror 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ụ 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ệ. Show Nội phân Chính showShow
Nội phân chính
8.1. Lỗi cú pháp¶8.2. Ngoại lệ ha 8.3. Xử lý các trường hợp ngoại lệ8.4. Tăng ngoại lệ 8.2. Ngoại lệ ha8.3. Xử lý các trường hợp ngoại lệ >>> 10 * (1/0) Traceback (most recent call last): File " 8.4. Tăng ngoại lệ 8,5. Chuỗi ngoại lệ 8.6. Các trường hợp ngoại lệ do người dùng xác định 8.7. Xác định các hành động dọn dẹp lists the built-in exceptions and their meanings. 8.3. Xử lý các trường hợp ngoại lệ8.4. 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...") ... 8,5. Chuỗi ngoại lệ
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: ... except (RuntimeError, TypeError, NameError): ... pass >>> while True print('Hello world') File " 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") 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 AT) mã thông báo trước mũi tên: trong ví dụ, lỗi được 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...") ...0, vì một dấu hai chấm ( >>> while True: ... try: ... x = int(input("Please enter a number: ")) ... break ... except ValueError: ... print("Oops! That was no valid number. Try again...") ...1) 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. Tất cả các trường hợp ngoại lệ kế thừa từ ... except (RuntimeError, TypeError, NameError): ... pass7, 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): ... pass8. 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) ... 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 " Đố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)=}") raise0). 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 "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 "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)=}") raise3 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 "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 "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)=}") raise5. Đ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)=}") raise6: >>> 10 * (1/0) Traceback (most recent call last): File "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 địnhCá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)=}") raise0, 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)=}") raise0 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ẹpTuyê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 "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)=}") raise5 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)=}") raise5 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)=}") raise5 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ệ:
Ví dụ: >>> 10 * (1/0) Traceback (most recent call last): File "6 Một ví dụ phức tạp hơn: >>> 10 * (1/0) Traceback (most recent call last): File "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)=}") raise5 đượ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)=}") raise5 đã đượ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)=}") raise5 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ướcMộ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 "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 "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 "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ọ. |