Là lỗi đàn áp thực hành xấu?


14

Trong một câu hỏi SO tôi đã hỏi ở đây về một số mã mà tôi không chắc chắn, có người đã trả lời "BTW, mã khủng khiếp ở đó: nó sử dụng biểu tượng triệt tiêu lỗi (@) rất nhiều."

Có một lý do tại sao điều này là thực hành xấu? Với những thứ như:

$db=@new mysqli($db_info) or die('Database error');

, nó cho phép tôi chỉ hiển thị một thông báo lỗi tùy chỉnh. Nếu không có lỗi, thì nó vẫn hiển thị thông báo PHP điển hình của:

Cảnh báo : mysqli :: mysqli (): php_network_getaddresses: getaddrinfo không thành công: Không có máy chủ nào như vậy được biết đến. trong một số \ file \ path trên dòng 6

cũng như 'Lỗi cơ sở dữ liệu'.

Là lỗi triệt tiêu luôn luôn xấu, và nếu vậy, những gì cụ thể về những điều trên là xấu?

Cập nhật: mã thực tế mà tôi đang sử dụng là:

or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b><br />Error occurred on line <b>' . __LINE__ . '</b> of <b>' . __FILE__ . '</b>' : ''))

trong đó loại bỏ tất cả đầu ra trước đó và hiển thị một thông báo lỗi. Vì vậy, thực tế là thông báo lỗi không bao gồm chi tiết về những gì đã xảy ra cụ thể (mà mọi người dường như đang đề xuất là lý do tại sao việc khắc phục lỗi là xấu) là không liên quan.


9
Là bịt mắt trong khi bạn đang lái xe xấu?
Damien Roche

Làm thế nào đây có thể là một câu hỏi nghiêm trọng? Tôi đoán nếu bạn muốn viết mã mất hàng giờ để gỡ lỗi, việc khắc phục lỗi sẽ là một điều tốt. Hãy suy nghĩ về nó, ứng dụng của bạn bị lỗi, làm hỏng dữ liệu ... và bạn không muốn biết tại sao hoặc ở đâu trong mã. Khi nào thì đó sẽ là một ý tưởng tốt? Bạn phải mời bạn bè của mình đến để thực hiện một bữa tiệc chăn gối cho bạn ... nó cũng theo logic tương tự.
Một số Mason miễn phí

1
@SomeFreeMason Nếu tôi cần gỡ lỗi thì tôi sẽ chỉ đặt $ debug_mode thành TRUE, vì mã thực tế tôi đang sử dụng là:or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b>' : ''))

@Paradoxical: Tôi nhận thấy trạng thái xử lý ngoại lệ / lỗi trong PHP là một chút FUBAR, nhưng bạn có biết rằng bạn có thể tắt hiển thị trực quan các lỗi trong cấu hình PHP của mình không?
Phoshi

@Phoshi không may là dịch vụ lưu trữ mà tôi đang sử dụng không cấp cho tôi quyền truy cập vào php.ini

Câu trả lời:


14

Tôi nghĩ rằng bạn đang làm điều đúng đắn bằng cách khắc phục lỗi, bởi vì bạn đang thực hiện xử lý lỗi của riêng mình.

Có thể dễ dàng hơn để xem xét tương đương trong, giả sử, Java. Loại bỏ lỗi sử dụng @tương tự như nuốt một ngoại lệ. Mã sau đây, tương tự như mã của bạn, là hợp lý:

try {
    db = new MySQLi(dbInfo);
} catch (SQLException connectionFailure) {
    die("Database error");
}

(Chà, trong Java, bạn sẽ không muốn công cụ servlet chết, nhưng bạn có ý tưởng.)

Tuy nhiên, điều này không được chấp nhận:

try {
    db = new MySQLi(dbInfo);
} catch (Exception e) {
}

Hầu hết việc loại bỏ lỗi PHP được thực hiện một cách bất cẩn, tương tự như ví dụ sau, do đó phản ứng giật đầu gối đối với mã của bạn.


3
Tôi sẽ không gọi bắt ngoại lệ và chỉ dừng thực thi để "xử lý" nó. Nếu bạn có thể giải quyết vấn đề, thật tuyệt, hãy làm như vậy. Nếu bạn không thể, bạn đang làm cái quái gì vậy? Đây là những gì chúng tôi có xử lý ngoại lệ cấp cao nhất cho. Nắm bắt các ngoại lệ trong trường hợp này chỉ là đảm bảo rằng bạn có mã xử lý lỗi rải khắp cơ sở mã của bạn.
Phoshi

7

Lỗi ức chế là xấu, bởi vì nó không chỉ ẩn thông tin mà bạn đã biết ( một cái gì đó đã đi sai). Nó cũng có thể ẩn thông tin quan trọng để gỡ lỗi mà bạn không biết ( cái gì , ở đâutại sao ).

Trong ví dụ cụ thể này, ăn trưa cơ sở dữ liệu lỗi Lỗi không phải là một thông báo lỗi rất tốt. Đã xảy ra lỗi với DB. Không giác ngộ lắm. Các “ Cảnh báo: mysqli :: mysqli (): php_network_getaddresses: getaddrinfo thất bại: Không có máy chủ như vậy được biết đến. trong một số \ file \ path trên dòng 6, thực sự là một thông báo lỗi tốt hơn. Nó cung cấp cho bạn một vị trí và lý do cho vấn đề. Bạn có thể nhảy ngay vào và bắt đầu gỡ lỗi, vì lỗi đã được định vị.

Tất nhiên, các nhà thiết kế thư viện đôi khi có xu hướng đưa ra nhiều cảnh báo không liên quan. Tôi không biết PHP đủ rõ để biết liệu nó có cách nào để lọc các cảnh báo mà bạn không quan tâm hay không. Tôi biết rằng việc đọc qua một ngăn xếp hàng trăm dòng không phải là rất sáng tỏ. Nhưng phản ứng chính xác với quá nhiều thông tin không phải là giảm lượng thông tin về 0 , mà là lọc ra những phần không liên quan ở một số giai đoạn. Các@ nhà điều hành không có granularity này (đó là phương châm là tất cả hoặc không có gì ), và do đó không phải là một công cụ phù hợp để quản lý lỗi hiệu quả.

Có một số trường hợp bạn biết rằng một lỗi nào đó sẽ xuất hiện và việc khắc phục sự cố thực tế sẽ tốn kém hơn so với việc tắt tiếng tin nhắn (và bị ảnh hưởng từ đó). Đây có thể là trường hợp trong một one-off kịch bản, nhưng gắn bó ngón tay của bạn vào tai của bạn và sẽ “ la la la ” là không một phản ứng chuyên nghiệp để lỗi (tiềm năng).


5
Bạn không muốn nói với người dùng của mình lỗi chính xác. Bạn thông báo cho họ lỗi là ở phía bạn và bạn đang làm việc với nó. Bạn có thể ghi lại các lỗi trên máy chủ của mình và thiết lập cảnh báo để bạn sẽ tự động biết về nó, nhưng không có lý do gì để hiển thị các lỗi này cho người dùng.
Jeroen Vannevel

1
Trên một trang web trực tiếp, chắc chắn sẽ tốt hơn cho một thông báo lỗi mà người dùng thông thường có thể hiểu được hiển thị, thay vì "một số rác kỹ thuật về mysqli, dù đó là gì"? Nếu tôi đang cố gắng gỡ lỗi thì tôi sẽ loại bỏ lỗi, nhưng trong một trang web trực tiếp, tôi không đồng ý rằng toàn bộ lỗi sẽ được hiển thị.

3
@Paradoxical Trên một trang web nghiêm túc, bạn sẽ không hiển thị thông báo lỗi như "lỗi cơ sở dữ liệu" và không có gì khác. Bạn sẽ hiển thị một trang "lỗi máy chủ nội bộ" chung chung với rất nhiều lông tơ, kiểu dáng, chân trang, v.v. diekhông phù hợp cho cả hai. Và thông tin chi tiết sẽ đi vào nhật ký bất kể những gì bạn hiển thị cho người dùng .

1
Có cách nào để trình bày một thông điệp thân thiện với người dùng trên màn hình và viết thông điệp kỹ thuật vào một tệp nhật ký không?
Thất vọngWithFormsDesigner

3
display_errorstắt, log_errorsbật và bạn khá tốt để đi, làm như bạn muốn khi phát hiện ra lỗi, nhưng đừng vứt chúng đi.
Wrikken

0

Việc khắc phục lỗi là xấu vì nó che giấu vấn đề, điều mà nhiều lần chúng ta thậm chí không nhận ra và nó có thể dẫn đến hành vi bất ngờ có thể chứng minh rất tốn kém trong một số ứng dụng quan trọng, ví dụ như trong các ứng dụng được sử dụng trong lĩnh vực tài chính, y tế và quốc phòng.

Nó cũng không phải là một ý tưởng tốt để xử lý các ngoại lệ trong mã và hiển thị các thông báo lỗi thực tế cho người dùng vì nó có thể dẫn đến các vấn đề bảo mật vì thông báo lỗi thường tiết lộ rất nhiều về mã của bạn, điều này có thể giúp người dùng và tin tặc độc hại thao túng hệ thống.

Vì vậy, cách tốt nhất là xử lý các lỗi ở các cấp độ khác nhau, ví dụ ở cấp cao nhất, bạn có thể xử lý lỗi bằng cách chỉ ghi lại lỗi thực tế và hiển thị một thông báo đơn giản và thân thiện với người dùng.


0

Có, toán tử triệt tiêu lỗi nói chung là một ý tưởng tồi.

Bạn nên quản lý báo cáo lỗi trong cấu hình ( php.ini). Vì vậy, bạn có thể chọn một cài đặt khác nhau cho từng môi trường (ví dụ: để lại các cảnh báo trong quá trình phát triển và ẩn chúng trong sản xuất).

Tình huống duy nhất khi sử dụng @có thể có ý nghĩa là khi bạn phát triển thư viện cho các nhà phát triển khác. Nếu bạn tự nguyện chọn làm điều gì đó tạo ra cảnh báo và không muốn làm phiền người dùng thư viện của bạn bằng một cảnh báo không phụ thuộc vào họ, @có thể là một giải pháp.

Tôi không thể nghĩ ra cách sử dụng nào khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.