Làm thế nào để bạn xử lý tất cả các ngoại lệ trong python?

Rất hay gặp lỗi trong quá trình thực thi chương trình. Hai loại lỗi phổ biến mà bạn có thể phải xử lý là lỗi cú pháp và ngoại lệ. Lỗi cú pháp xảy ra khi bạn nhập sai mã. Trong những trường hợp như vậy, dòng sai được trình phân tích cú pháp lặp lại với một mũi tên chỉ đến vị trí sớm nhất mà lỗi được phát hiện

Ngoại lệ khác với lỗi cú pháp. Chúng xảy ra khi có điều gì đó bất ngờ xảy ra trong quá trình thực thi chương trình. Ví dụ: giả sử bạn đang yêu cầu người dùng nhập một số để thực hiện phép chia. Bây giờ, nếu người dùng nhập một chuỗi thay vì một số và bạn cố gắng chia một số cho đầu vào đã cho, chương trình sẽ xuất ra một giá trị

keep_asking = True
98

Khi bạn không xử lý đúng các trường hợp ngoại lệ, chương trình sẽ đột ngột thoát ra vì không biết phải làm gì trong những trường hợp như vậy. Đoạn mã sau là một ví dụ như vậy

1
keep_asking = True
2
3
while keep_asking:
4
    x = int(input("Enter a number: "))
5
    print("Dividing 50 by", x,"will give you :", 50/x)

Miễn là bạn đang nhập một giá trị đầu vào tích phân, chương trình sẽ hoạt động chính xác. Tuy nhiên, ngay khi bạn nhập một chuỗi hoặc thậm chí một số thập phân làm đầu vào, bạn sẽ nhận được một ngoại lệ

keep_asking = True
99

1
keep_asking = True
0_______3_______
keep_asking = True
2_______4_______
keep_asking = True
4_______6_______0_______6
5
keep_asking = True
8
keep_asking = True
9
2
0

Từ truy nguyên ở trên, chúng ta có thể thấy rằng người dùng nhập một chuỗi

2
00 thay vì một số, dẫn đến ______0_______99. Truy nguyên cũng cho chúng ta thấy vị trí chính xác của lỗi, tôi. e. dòng 4, cho phép chúng tôi quay lại mã và sửa nó

Trong hướng dẫn này, bạn sẽ học cách xử lý đúng cách và đưa ra các ngoại lệ trong Python

Một số ngoại lệ phổ biến

Dưới đây là một số ngoại lệ cơ bản mà bạn có thể gặp phải khi viết chương trình. Bạn có thể đọc về nhiều hơn nữa trên trang web chính thức

  • 2
    02. Ngoại lệ này được đưa ra khi chương trình không thể tìm thấy tên cục bộ hoặc toàn cầu. Tên không thể tìm thấy được bao gồm trong thông báo lỗi
  • 2
    03. Ngoại lệ này được đưa ra khi một hàm được truyền một đối tượng thuộc loại không phù hợp làm đối số của nó. Thông tin chi tiết về loại sai được cung cấp trong thông báo lỗi
  • 2
    04. Ngoại lệ này xảy ra khi một đối số hàm có kiểu phù hợp nhưng giá trị không phù hợp
  • 2
    05. Ngoại lệ này được đưa ra khi một đối tượng được cho là hỗ trợ một hoạt động nhưng nó chưa được thực hiện. Bạn không nên sử dụng lỗi này khi chức năng đã cho không có nghĩa là hỗ trợ loại đối số đầu vào. Trong những tình huống đó, việc đưa ra một ngoại lệ
    keep_asking = True
    
    98 sẽ phù hợp hơn
  • 2
    07. Ngoại lệ này được đưa ra khi bạn cung cấp đối số thứ hai cho phép chia hoặc phép toán modulo bằng 0
  • 2
    08. Ngoại lệ này được đưa ra khi tệp hoặc thư mục mà chương trình yêu cầu không tồn tại

Cũng giống như các tên ở trên, hầu hết các trường hợp ngoại lệ đều có tên dễ hiểu

Xử lý một ngoại lệ

Đoạn mã ở đầu bài viết yêu cầu người dùng nhập một số nguyên làm đầu vào. Nếu người dùng không cung cấp đầu vào số nguyên, chương trình sẽ dừng thực thi và đưa ra một ngoại lệ lỗi giá trị. Trong phần này, chúng tôi sẽ viết một số mã để cho người dùng biết rằng đầu vào của họ không phải là một giá trị số nguyên hợp lệ

Xử lý ngoại lệ cho phép các chương trình của chúng tôi tiếp tục thực thi ngay cả khi xảy ra lỗi

Mệnh đề Try-Exception

Bước đầu tiên của quy trình là bao gồm mã mà bạn nghĩ có thể đưa ra ngoại lệ bên trong mệnh đề

2
09. Bước tiếp theo là sử dụng từ khóa
2
10 để xử lý ngoại lệ xảy ra trong đoạn mã trên. Mã sửa đổi cho đầu vào của người dùng sẽ giống như thế này

1
________0____3_______
3
while keep_asking:
4
2
7
5
3_______9
keep_asking = True
9
3
1
3
2
3
3
3
4
3
5

Điều xảy ra ở đây là chương trình cố gắng thực thi mã bên trong mệnh đề

2
09. Nếu không có ngoại lệ nào được đưa ra, chương trình sẽ bỏ qua mệnh đề
2
10 và phần còn lại của mã thực thi bình thường. Nếu một ngoại lệ được đưa ra, chương trình sẽ bỏ qua mã còn lại bên trong mệnh đề
2
09 và loại ngoại lệ được so khớp với tên của ngoại lệ sau từ khóa
2
10. Trong trường hợp trùng khớp, mã bên trong mệnh đề
2
10 được thực thi trước, sau đó phần còn lại của mã sau mệnh đề
2
09 được thực thi bình thường

Khi bạn nhập một số nguyên làm đầu vào, chương trình sẽ cung cấp cho bạn kết quả cuối cùng của phép chia. Khi một giá trị không tách rời được cung cấp, chương trình sẽ in một thông báo yêu cầu bạn thử nhập lại một số nguyên. Lưu ý rằng thời gian này, chương trình không thoát đột ngột khi bạn nhập dữ liệu không hợp lệ

Nếu bạn nhập một số không phải là số nguyên, bạn sẽ nhận được đầu ra sau trên thiết bị đầu cuối của mình

1
3
7_______3_______
3
9_______4_______
while keep_asking:
1

Bạn có thể có nhiều mệnh đề

2
10 để xử lý các trường hợp ngoại lệ khác nhau. Xin lưu ý rằng những trình xử lý này sẽ chỉ xử lý các trường hợp ngoại lệ xảy ra trong mệnh đề
2
09 tương ứng. Họ sẽ không xử lý bất kỳ ngoại lệ nào được nêu trong các trình xử lý ngoại lệ khác

Bạn cũng có thể xử lý nhiều ngoại lệ bằng cách sử dụng một mệnh đề

2
10 duy nhất bằng cách chuyển các ngoại lệ này sang mệnh đề dưới dạng
2
20

1
while keep_asking:
3_______3_______
while keep_asking:
5_______4__________
while keep_asking:
7

Cuối cùng, bạn cũng có thể bỏ tên của ngoại lệ sau từ khóa

2
10. Điều này thường không được khuyến nghị vì mã bây giờ sẽ bắt tất cả các ngoại lệ và xử lý chúng theo cùng một cách. Điều này không tối ưu vì bạn sẽ xử lý một ngoại lệ
keep_asking = True
98 giống như cách bạn đã xử lý một ngoại lệ
2
23. Khi xử lý các trường hợp ngoại lệ, tốt hơn là bạn nên càng cụ thể càng tốt và chỉ nắm bắt những gì bạn có thể xử lý

Một cách có thể sử dụng để nắm bắt tất cả các ngoại lệ là in đúng lỗi ngoại lệ trên màn hình, như đoạn mã sau

1
while keep_asking:
9_______3__________
4
1_______4_______
4
___
4
4
5
6_______6
keep_asking = True
9
4
8
3
2
    x = int(input("Enter a number: "))
0
3
4
    x = int(input("Enter a number: "))
2
    x = int(input("Enter a number: "))
3
    x = int(input("Enter a number: "))
4

Sử dụng khoản Else

Bạn cũng có thể sử dụng mệnh đề

2
24 trong câu lệnh
2
25. Mệnh đề
2
24 có nghĩa là chứa mã cần được thực thi nếu mệnh đề
2
09 không đưa ra bất kỳ ngoại lệ nào. Điều này có thể hữu ích để đảm bảo rằng bạn không thêm bất kỳ mã nào vào khối
2
09 có ngoại lệ mà bạn không có ý định bắt. Một điều đáng nói là nếu bạn quyết định sử dụng mệnh đề
2
24, bạn nên đưa nó vào sau tất cả các mệnh đề
2
10 nhưng trước khối
2
31

Trong trường hợp của chúng tôi, chúng tôi có thể di chuyển dòng in kết quả phép chia của chúng tôi bên trong khối

2
24

1
________0____3_______
3
while keep_asking:
___
4
2
7
5
3_______9
keep_asking = True
9
3
3
3
2
5
7
3
4
5
9
    x = int(input("Enter a number: "))
3
3
1

Dọn dẹp Sử dụng Mệnh đề Cuối cùng

Giả sử bạn đã viết một số mã bên trong khối

2
09 được cho là thực hiện một tác vụ bằng cách sử dụng một lượng lớn tài nguyên. Điều quan trọng là phải trả lại các tài nguyên đó khi bạn sử dụng xong chúng. Điều này có thể dễ dàng đạt được bằng cách sử dụng mệnh đề
2
31

Mã bên trong mệnh đề

2
31 luôn được thực thi bất kể khối
2
09 có đưa ra ngoại lệ hay không. Bạn có thể xác minh điều này bằng cách chạy đoạn mã sau

1
________0____3_______
3
while keep_asking:
4
2
7
5
3_______9
keep_asking = True
9
3
3
3
2
5
7
3
4
5
9
    x = int(input("Enter a number: "))
3
3
1
1
9
keep_asking = True
00
keep_asking = True
01_______0_______02

Nếu bất kỳ mệnh đề

2
10 nào mà bạn đã chỉ định không xử lý ngoại lệ được đưa ra, thì ngoại lệ tương tự sẽ được đưa ra lại sau khi thực thi mã bên trong khối
2
31

Một ví dụ phức tạp hơn

Trong phần này, chúng tôi sẽ viết một chương trình để xử lý nhiều ngoại lệ. Cũng giống như các ví dụ trước, chúng ta sẽ thực hiện một số phép toán. Tuy nhiên, lần này chúng tôi sẽ lấy đầu vào từ một danh sách

Đoạn mã sau kiểm tra hai trường hợp ngoại lệ,

keep_asking = True
98 và
keep_asking = True
99. Khối
2
24 được sử dụng để in giai thừa. Bạn có thể thấy ở đầu ra rằng mã này chỉ được thực thi khi không có ngoại lệ nào được đưa ra

1
while keep_asking:
9
2
3
keep_asking = True
07
4
5
keep_asking = True
10
keep_asking = True
9
2
7
3
2
keep_asking = True
14
3
4
keep_asking = True
16
    x = int(input("Enter a number: "))
3
keep_asking = True
18
1
9
3
3
keep_asking = True
01
keep_asking = True
22
keep_asking = True
23
5
9
keep_asking = True
25
keep_asking = True
26
keep_asking = True
27
keep_asking = True
00
keep_asking = True
29
keep_asking = True
30

Đoạn mã trên tạo ra đầu ra sau

1
keep_asking = True
32_______3_______
keep_asking = True
34
3
___
4
keep_asking = True
37
5
0_______34
keep_asking = True
9
3
2
keep_asking = True
42
3
4
keep_asking = True
34
    x = int(input("Enter a number: "))
3
1
9
keep_asking = True
47
keep_asking = True
01_______0_______34

Một điều đáng chú ý nữa là mã bên trong mệnh đề

2
31 được thực thi cho mỗi mục trong danh sách

Ngoại lệ do người dùng xác định

Đôi khi, bạn muốn đưa ra các ngoại lệ mà Python không cung cấp. Các ngoại lệ do người dùng xác định giúp chương trình dễ đọc hơn. Ví dụ: giả sử bạn đang thiết kế một phần của chương trình kiểm tra xem mã phiếu giảm giá do người dùng gửi có hợp lệ không. Sau đó, bạn sẽ cần tạo một ngoại lệ tùy chỉnh cho mục đích đó

Các ngoại lệ tùy chỉnh kế thừa từ lớp cơ sở Python

2
43 như sau

1
keep_asking = True
51____3_______
keep_asking = True
53

Các ngoại lệ cũng được định nghĩa theo cách tương tự như các ngoại lệ của Python bằng cách kết thúc bằng

2
44, mặc dù đây là tùy chọn

Khi

2
43 được xác định, bạn có thể sử dụng nó trong chương trình của mình như sau

1
keep_asking = True
55_______3_______
keep_asking = True
57_______4__________
keep_asking = True
59
4
0_______61
5
0_______63
keep_asking = True
9
keep_asking = True
65

Trong mã ở trên, chúng tôi yêu cầu người dùng cung cấp mã phiếu giảm giá và nếu mã phiếu giảm giá mà họ cung cấp không có trong

2
46, thì một
2
47 sẽ xuất hiện

1
keep_asking = True
67_______3_______
keep_asking = True
4_______4_______
keep_asking = True
71
4
0_______73
5
keep_asking = True
75

Để tùy chỉnh lỗi hơn nữa, bạn có thể xác định một thông báo thân thiện hơn với người dùng

1
keep_asking = True
51
2
keep_asking = True
79_______4__________
keep_asking = True
81
4
0_______83
5
0_______85
keep_asking = True
9
keep_asking = True
87

Bây giờ nếu bạn chạy lại chương trình, người dùng sẽ nhận được thông báo lỗi thân thiện hơn

1
keep_asking = True
89
2
keep_asking = True
4_______4_______
keep_asking = True
93
4
keep_asking = True
95
5
keep_asking = True
97

Suy nghĩ cuối cùng

Tôi hy vọng hướng dẫn này đã giúp bạn hiểu cách xử lý ngoại lệ trong Python. Ngoài ra, đừng ngần ngại xem những gì chúng tôi có sẵn để bán và nghiên cứu trên thị trường

Xử lý ngoại lệ đúng cách có thể rất hữu ích trong các trường hợp không thể thoát khỏi chương trình sau khi chương trình nhận được đầu vào không mong muốn. Nếu bạn có bất kỳ câu hỏi nào liên quan đến xử lý ngoại lệ trong Python, vui lòng cho tôi biết trên diễn đàn

Học Python

Tìm hiểu Python với hướng dẫn hướng dẫn Python hoàn chỉnh của chúng tôi, cho dù bạn mới bắt đầu hay bạn là một lập trình viên dày dặn đang tìm cách học các kỹ năng mới

Bài đăng này đã được cập nhật với sự đóng góp từ Esther Vaati. Esther là nhà phát triển và viết phần mềm cho Envato Tuts+