Menu
CoddyTech

Lỗi runtime (runtime error) là gì?

Lỗi runtime (runtime error, lỗi thực thi) là lỗi xảy ra trong lúc chương trình đang chạy, khi một phép toán không thể thực hiện với các giá trị hiện có, như chia cho 0 hay đọc vượt quá cuối danh sách. Chương trình dừng ở dòng đó, trừ khi lỗi được xử lý.

Tác giả Kevin Spektor, Co-founder & CTO

Cập nhật 24 tháng 9, 2026

Lỗi runtime chờ đến khi chương trình đã chạy. Code vượt qua mọi bước kiểm tra trước khi bắt đầu, chạy đúng được một lúc, rồi gặp một phép toán không thể thực hiện với các giá trị nó đang có tại thời điểm đó. Hàm này chạy đúng với một danh sách và lỗi với danh sách khác:

85.0
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    print(average([]))
          ^^^^^^^^^^^
  File "main.py", line 2, in average
    return sum(scores) / len(scores)
           ~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero

Lần gọi đầu tiên in ra 85.0. Lần gọi thứ hai truyền vào một danh sách rỗng, nên len(scores) bằng 0 và phép chia không thể thực hiện. Ngữ pháp không có gì sai, nên đây không phải lỗi cú pháp. Vấn đề chỉ tồn tại với một số dữ liệu nhất định, đó là lý do lỗi runtime có thể xuất hiện sau khi chương trình đã chạy đúng cả trăm lần.

Chuyện gì xảy ra khi gặp lỗi runtime

  1. Chương trình đi đến một phép toán, ở đây là sum(scores) / len(scores).
  2. Runtime kiểm tra phép toán trước khi thực hiện. CPython kiểm tra số chia trước khi chia, JVM kiểm tra mọi chỉ số mảng, còn Python kiểm tra khóa có tồn tại trong từ điển không trước khi trả về giá trị.
  3. Bước kiểm tra thất bại, nên runtime tạo ra một đối tượng lỗi. Trong Python và Java, đối tượng này là một ngoại lệ (exception), ghi lại loại lỗi, thông báo và nơi xảy ra lỗi.
  4. Runtime tìm code xử lý loại lỗi đó, trước tiên trong hàm hiện tại, rồi đến hàm đã gọi nó, cứ thế lan dần ra ngoài.
  5. Nếu không có gì xử lý, chương trình dừng lại. Python in ra traceback và thoát với mã trạng thái 1. Java in ra stack trace bắt đầu bằng Exception in thread "main".

Các ngôn ngữ không có những bước kiểm tra này hoạt động khác. C không kiểm tra chỉ số mảng hay con trỏ, nên một lần truy cập bộ nhớ sai hoặc âm thầm làm hỏng dữ liệu, hoặc khiến hệ điều hành kết thúc chương trình với lỗi segmentation fault.

Mọi việc chương trình đã làm trước dòng lỗi đều đã xảy ra. Vòng lặp này in ra ba màu trước khi lỗi ở lượt thứ tư:

red
green
blue
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    print(colors[i])
          ~~~~~~^^^
IndexError: list index out of range

Cách đọc traceback

Hãy đọc traceback của Python từ dưới lên. Dòng cuối cùng cho biết loại lỗi và thông báo: ZeroDivisionError: division by zero. Các dòng phía trên liệt kê chuỗi lời gọi, cũ nhất ở trên và mới nhất ở dưới. Trong ví dụ đầu tiên, dòng 5 gọi average, và dòng 2, bên trong average, là nơi phép chia thất bại.

Dòng xảy ra lỗi không phải lúc nào cũng là dòng cần sửa. Dòng 2 của average không sai. Câu hỏi thật sự là làm sao một danh sách rỗng lại đến được đó, nên hãy lần ngược giá trị sai về nơi nó xuất phát và sửa ở đó. Khi traceback đi qua các tệp thư viện không phải do bạn viết, hãy tìm dòng cuối cùng trỏ vào tệp của chính bạn.

Các lỗi runtime thường gặp

Mỗi thông báo dưới đây được sao chép từ Python 3.12.

LỗiVí dụThông báo
ZeroDivisionError10 / 0division by zero
IndexError["red", "green", "blue"][3]list index out of range
KeyError{"theme": "dark"}["font"]'font'
ValueErrorint("twenty")invalid literal for int() with base 10: 'twenty'
TypeError"Total: " + 5can only concatenate str (not "int") to str
AttributeErrorgọi .upper() trên None'NoneType' object has no attribute 'upper'
FileNotFoundErroropen("missing.txt")[Errno 2] No such file or directory: 'missing.txt'
RecursionErrormột hàm tự gọi chính nó mãi mãimaximum recursion depth exceeded

Java có các lỗi tương đương trực tiếp, như ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException và NullPointerException. Một phép chia số nguyên cho 0 không được bắt sẽ in ra dòng này trong Java:

Exception in thread "main" java.lang.ArithmeticException: / by zero

JavaScript dễ dãi hơn với số: 10 / 0 là Infinity, không phải lỗi. Nó chỉ lỗi khi bạn dùng một giá trị không tồn tại. Node.js in ra dòng này với user.name khi user là undefined:

TypeError: Cannot read properties of undefined (reading 'name')

Cách sửa lỗi runtime

  1. Tái hiện lỗi. Chạy lại chương trình với cùng đầu vào và xác nhận bạn gặp đúng lỗi đó.
  2. Đọc dòng cuối của traceback, rồi tìm dòng tương ứng trong code của bạn.
  3. Xem các giá trị liên quan. In chúng ra ngay trước dòng lỗi, hoặc dừng ở đó bằng breakpoint của debugger.
  4. Sửa nguyên nhân. Sửa chỉ số, chặn trường hợp đặc biệt, hoặc kiểm tra đầu vào trước khi dùng.

Với hàm average, cách sửa là quyết định điểm trung bình khi không có điểm nào nên là bao nhiêu, rồi ghi rõ điều đó trong code:

85.0
0

Một số lỗi nằm ngoài tầm kiểm soát của bạn: một tệp đã bị xóa, mạng bị quá thời gian chờ, người dùng gõ chữ vào chỗ cần số. Bạn không thể ngăn những lỗi đó bằng cách sửa code, nên bạn bắt chúng bằng xử lý ngoại lệ và quyết định chương trình làm gì tiếp theo. Điều không nên làm là bọc một bug trong try để giấu nó đi. Một IndexError từ vòng lặp đếm dư một bước là sai sót cần sửa, không phải lỗi để bắt.

Thông báo lỗi runtime trên Windows và trong Excel

Thuật ngữ này cũng xuất hiện bên ngoài code của bạn. Một hộp thoại Windows có tiêu đề Microsoft Visual C++ Runtime Library kèm dòng chữ Runtime Error! nghĩa là một chương trình viết bằng C++ đã gặp lỗi nghiêm trọng và runtime C++ đã kết thúc nó. Là người dùng, bạn không thể sửa code đó, nên cách khắc phục thường là cập nhật chương trình, sửa chữa hoặc cài lại các gói Microsoft Visual C++ Redistributable, và với game thì cập nhật driver card đồ họa.

Macro Excel viết bằng VBA báo các lỗi runtime có đánh số. Run-time error '9': Subscript out of range nghĩa là macro yêu cầu một trang tính hoặc phần tử mảng không tồn tại, còn Run-time error '1004' là lỗi chung xuất hiện khi một thao tác trên workbook, trang tính hoặc vùng ô thất bại. Ý tưởng giống hệt trong Python: code hợp lệ gặp một giá trị nó không xử lý được.

Đọc tiếp

Lỗi runtime có hai người anh em: lỗi cú pháp, được phát hiện trước khi chương trình bắt đầu, và lỗi logic, loại không bao giờ tạo ra thông báo nào. Để phục hồi sau lỗi runtime thay vì để chương trình dừng đột ngột, hãy đọc xử lý ngoại lệ, rồi đến các hướng dẫn Python về ngoại lệ và gỡ lỗi. Khóa học Python cho bạn viết và sửa những đoạn code như thế này trong mọi bài học.

Câu hỏi thường gặp

Lỗi runtime và lỗi cú pháp khác nhau thế nào?

Lỗi cú pháp được phát hiện trước khi chương trình bắt đầu, vì code vi phạm ngữ pháp của ngôn ngữ, nên không dòng nào được chạy. Lỗi runtime xảy ra sau đó, trong lúc chương trình đang chạy, khi một dòng hợp lệ gặp một giá trị nó không xử lý được. Mọi dòng trước đó đều đã chạy và có thể đã in ra kết quả.

Vì sao code cứ gặp lỗi runtime?

Thường là vì code giả định một điều về dữ liệu nhưng điều đó không phải lúc nào cũng đúng: danh sách không bao giờ rỗng, tệp luôn tồn tại, người dùng sẽ gõ một con số. Mỗi giả định đúng với những đầu vào bạn đã thử và sai với một đầu vào bạn chưa thử. Hãy thử với đầu vào rỗng, bằng 0, bị thiếu và rất lớn, rồi kiểm tra hoặc xử lý rõ ràng các trường hợp đó.

Runtime Error trên LeetCode nghĩa là gì?
Nghĩa là lời giải của bạn đã biên dịch được nhưng bị dừng đột ngột ở ít nhất một test case. Nguyên nhân thường gặp là chỉ số vượt phạm vi, chia cho 0, dùng giá trị null hoặc None, hoặc đệ quy quá sâu đến mức tràn stack. Hãy tự chạy đầu vào bị lỗi hiện trên trang kết quả, và kiểm tra các trường hợp biên: mảng rỗng, một phần tử và kích thước lớn nhất cho phép.
Lỗi runtime có giống ngoại lệ không?
Không hẳn. Trong Python và Java, phần lớn lỗi runtime được báo dưới dạng ngoại lệ (exception), nhờ đó chương trình có thể bắt chúng. Nhưng những ngôn ngữ như C có lỗi runtime mà hoàn toàn không có ngoại lệ. Trong Java, RuntimeException còn là tên của một nhóm ngoại lệ cụ thể, nhóm unchecked như NullPointerException.
Trình biên dịch có bắt được lỗi runtime không?

Chỉ một phần. Trình biên dịch hoặc công cụ kiểm tra kiểu như mypy có thể chứng minh một số sai sót là không thể xảy ra, ví dụ cộng văn bản với số. Nhưng nó không thể biết các giá trị đến trong lúc chương trình chạy, như một số người dùng gõ vào mà hóa ra lại bằng 0. Những lỗi đó chỉ tìm ra được bằng cách chạy code, hoặc xử lý được bằng cách kiểm tra đầu vào.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu