# 26: Đừng bỏ qua những cảnh báo lỗi

Một đêm, tôi đang đi bộ đến quán bar để gặp vài người bạn. Chúng tôi đã không uống bia cùng nhau một thời gian và tôi đang rất mong gặp lại họ. Trong lúc hối hả, tôi không để ý những thứ tôi lướt qua. Tôi vấp vào một mô đất và ngã dập mặt. Vâng, tôi đã bất cẩn và lãnh hậu quả ngay tức khắc.

Mặc cho cái chân đau, tôi vẫn vội vã đi đến điểm hẹn gặp các bạn. Tôi đứng dậy và tiếp tục đi. Càng đi xa, cơn đau càng trở nên tồi tệ. Mặc dù cú ngã không khiến tôi quá bận tâm, nhưng tôi cảm thấy có gì đó không ổn.

Tôi vẫn đến quán bar như đã hẹn. Và khi tôi đến nơi, nó thật sự đau đớn. Tôi không thể có một đêm vui chơi như mong đợi, bởi vì cơn đau cứ hành hạ tôi. Đến sáng, tôi đi khám và nhận ra xương cẳng chân đã bị gãy. Tôi đúng ra đã tránh được những tổn thương này, nếu đêm hôm đó tôi quyết định dừng lại thay vì tiếp tục chuyến đi ngay khi cảm nhận được cơn đau. Đó thật là buổi sáng tồi tệ nhất trên đời!!

Rất nhiều lập trình viên đang viết code giống như cách tôi tạo nên cái đêm thảm họa kia.

Lỗi?? Lỗi nào? Nó không quan trọng. Trung thực mà nói, tôi có thể bỏ qua nó. Đó không phải là phương châm đúng đắn để viết lên những đoạn code chặt chẽ. Trên thực tế, nó chẳng qua là cách biện minh cho sự lười biếng thì đúng hơn. (Một lựa chọn sai lầm.) Bất kể bạn nghĩ như thế nào về lỗi trong đống code của mình, bạn luôn cần kiểm tra, và luôn cần xử lý nó. Mọi lần như một. Nếu bạn bỏ qua việc này, chẳng những không giúp bạn tiếp kiệm thời gian mà nó còn ẩn chứa những nguy cơ tiềm ẩn về sau. Chúng ta kiểm tra lỗi trong code theo nhiều cách, bao gồm:

Mã trả về được sử dụng như là kết quả cuối cùng của một hàm (function) với hàm ý rằng “nó không chạy được”. Lỗi này rất dễ bị bỏ qua. Bởi vì nó chẳng hề được thông báo gì cả. Trên thực tế, đối với các functions trong ngôn ngữ C, việc bỏ qua những mã trả về kiểu này đã trở thành một thói quen chung mất rồi. Bạn có mấy khi sử dụng hàm printf để kiểm tra mã trả về đâu, đúng không?

Errno (error number — mã số lỗi) đây là một biến số đặc trưng của C, một biến global riêng biệt được thiết lập để thông báo lỗi. Nó cũng hay bị bỏ qua, cũng rất khó xài, và thường mang tới một mớ vấn đề gây nhức óc. Ví dụ, sẽ thế nào nếu bạn gọi đa luồng trong một hàm? Một số môi trường có thể ngăn bạn phạm vào những lỗi thế này. Nhưng hầu hết thì không Exception (ngoại lệ ⚠) là một phương án được thiết kế để hỗ trợ cho việc thông báo và xử lý lỗi trong ngôn ngữ lập trình. Và nó không thể bị bỏ qua. Mà thực ra vẫn có thể!! Tôi đã chứng kiến nhiều đoạn code như thế này.

try {
// …do something…
} catch () {} // ignore errors

Ít ra cái cấu trúc khủng khiếp này cũng mang lại đôi chút ý nghĩa. Đó là nó đang cảnh báo một thực tế là bạn đang làm một việc gì đó thiếu lương tâm.

Nếu bạn bỏ qua một thông báo lỗi, giả mù và vờ như chẳng có gì sai sót xảy ra, thì bạn đang gây ra những rủi ro lớn. Làm việc bất chấp các cảnh báo có thể dẫn tới những sự hủy hoại rất nghiêm trọng, giống như cái cẳng chân của tôi đã phải gánh hậu quả nặng nề, vì tôi đã không dừng ngay việc đi lại. Vì vậy, hãy luôn xử lý các vấn đề ngay khi nó xuất hiện. Chớ để đêm dài lắm mộng.

Việc không xử lý những cảnh báo lỗi có thể dẫn tới:

  • Code không chặt chẽ. Code theo cảm tính và rất khó phát hiện bugs
  • Code không an toàn. môt lỗi không được xử lý tốt có thể bị kẻ khác lợi dụng để đột nhập vào hệ thống.
  • Cấu trúc tồi.

Nếu như code của bạn bị lỗi và chúng cứ lặp đi lặp lại liên tục, thì chắc chắn là cách tiếp cận của bạn không ổn. Khắc phục nó sẽ giúp những thông báo lỗi trở nên dễ đọc, và việc xử lý chúng cũng sẽ đỡ vất vả hơn.

Cũng như việc kiểm tra lỗi trong code, việc dự liệu trước các điều kiện, khả năng gây phát sinh lỗi cũng rất cần thiết. Không nên trốn tránh việc này và làm như thể ứng dụng của bạn sẽ hoạt động trong mọi tình huống.

Tại sao chúng ta không kiểm tra những cảnh báo lỗi? Có nhiều lý do. Lý do nào bạn đồng ý? Nếu không đồng ý, bạn sẽ phản bác chúng như thế nào?

  • Việc xử lý những thông báo lỗi sẽ làm code trở nên hỗn loạn, khó đọc, và khó xác định những dòng code có chức năng “bình thường” ở đâu.
  • Đó là việc phụ, còn tôi đang bị deadline dí rồi!!!
  • Tôi biết hàm này sẽ không bao giờ trả về lỗi (hàm printf luôn hoạt động trôi chảy, hàm malloc luôn trả về vùng nhớ mới -– mà giả sử nó không hoạt động thì chúng ta sẽ gặp một vấn đề khác còn nghiêm trọng hơn…)
  • Đây chỉ là một chương trình làm giải trí thôi, Không cần phải nâng level nó lên như thế.