Làm thế nào để bạn chỉ định mã lỗi?


13

Làm thế nào, khi phát triển một dự án có quy mô vừa, bạn có xác định, tạo và duy trì mã lỗi không?

Đối với cuộc sống của tôi, tôi không thể nghĩ ra một phương pháp đơn giản và sạch sẽ để làm như vậy. Một số ý tưởng của tôi chuyển đổi tên lớp và tên phương thức thành một chuỗi số nguyên, nhưng đó là cách lâu dài để hiển thị cho người dùng trên thực tế là tên phương thức và tên lớp có thể thay đổi (hy vọng là không!). Những người khác chỉ đang sử dụng một hệ thống nhật ký gia tăng (nghĩa là khi tôi tạo một thông báo lỗi mới, chỉ cần thêm 1 vào id thông báo lỗi cuối cùng). Nhưng đó chỉ là hoàn toàn không có tổ chức.

Để cụ thể hơn, tôi đang nói về mã lỗi, chẳng hạn như:

Error 401 Unauthorized.


1
mã lỗi? Giống như "số ma thuật"? Ví dụ ... ERROR 001. Sau đó, bạn vào một danh sách và đọc ERROR 001 có nghĩa là bla bla bla ... Vâng?
wleao

@wleao - Yessir. Tôi sẽ chỉnh sửa câu hỏi của tôi để bao gồm điều đó. Cảm ơn bạn.
ahodder


Khi bạn chỉnh sửa trong câu hỏi của bạn. Hãy xem cách họ làm điều đó với http. Tôi không biết có nên sử dụng số ma thuật không. Tuy nhiên, nếu bạn thực sự sẵn sàng làm điều đó, hãy làm theo các khái niệm của họ. Chẳng hạn, họ có phân loại lỗi (bạn có bị như vậy không?).
wleao

@wleao - chưa, nhưng nhờ có bạn và Péter Török, tôi chắc chắn sẽ tạo ra một cái. :)
ahodder

Câu trả lời:


16

Không.

Mã lỗi là lỗi thời, chúng xuất phát từ thời xa xưa khi đầu ra thực sự khó khăn và tốn kém, và cách duy nhất để báo hiệu tình trạng lỗi có thể là thông qua một loạt đèn phía trước: bảng điều khiển phía trước pdp11 / 70

Ngày nay, chúng tôi đã xử lý ngoại lệ trưởng thành được tích hợp vào khá nhiều ngôn ngữ chính. Sử dụng nó. Cung cấp cho người dùng thông tin họ có thể làm việc với; đừng làm phiền họ với blah-blah kỹ thuật, mà nên nói cho họ biết những gì đã sai và họ có thể làm gì với nó. Để đăng nhập, chỉ cần đưa ra các tên mô tả ngoại lệ của bạn và đăng nhập tên. Dễ nhớ hơn và cũng dễ tìm hơn bằng cách sử dụng grep hoặc các công cụ tìm kiếm tương tự.

Tất nhiên, ngoại lệ là khi bạn lập trình cho các tình huống mà đầu ra vẫn khó khăn và tốn kém, chẳng hạn như các hệ thống nhúng hoặc giao thức mạng. HTTP vẫn sử dụng mã phản hồi số vì chúng cực kỳ dễ phân tích hiệu quả - trong một số trường hợp, chỉ đọc chữ số đầu tiên có thể cho bạn biết đủ và bạn có thể loại bỏ phần còn lại của gói.


Cảm ơn bạn đã trả lời chi tiết, điều đó rất có ý nghĩa và là tốt để biết.
ahodder

Việc bạn sử dụng minh họa phù hợp với lập luận của bạn một cách hoàn hảo. Tôi đã đọc về PDP-11 mãi mãi. Nhưng đây thực sự là cái đầu tiên tôi từng thấy. Cảm ơn.
Mike Owens

2
Bên trong mã, tôi muốn xử lý một mã lỗi và tôi không già như vậy.
JeffO

@Jeff: Bất cứ điều gì bạn có thể làm với mã lỗi cũng có thể được thực hiện với các ngoại lệ, và sau đó một chút nữa. Nếu bạn muốn bắt chước mã lỗi với các ngoại lệ, tất cả những gì bạn cần làm là ném thay vì trả lại mã lỗi và bắt thay vì so sánh giá trị trả về với E_OK (hoặc bất cứ phản hồi OK nào). Mặc dù vậy, công bằng mà nói, C không có ngoại lệ thực sự, và việc di chuyển dài không thuận tiện, vì vậy nếu bạn đang làm C, bạn có phần bị bào chữa.
tdammers

@Mike: Hình ảnh được lấy từ bài viết trên wikipedia về sê-ri PDP-11; nếu điều đó không dễ tìm thì tôi không biết nó là gì.
tdammers

6

Bạn nên kiểm tra cách mã lỗi / mã trạng thái được tổ chức trong các giao thức phổ biến như HTTP . Họ bảo lưu phạm vi riêng biệt cho các loại trạng thái / lỗi khác nhau. Điều này giúp người dùng dễ dàng xác định mã trạng thái không xác định và nhà phát triển gán mã cho một loại lỗi mới chưa được xử lý trước đó.


Thêm vào câu trả lời của bạn điều phân loại. Nó sẽ làm cho mọi thứ dễ dàng hơn để quản lý và duy trì các lỗi.
wleao

3

Xin lỗi, tại sao sử dụng mã lỗi ở tất cả?
Nắm bắt ngoại lệ, đăng nhập và đề nghị gửi báo cáo nếu chương trình không thể phục hồi .

(Giả sử ngôn ngữ của bạn hỗ trợ các ngoại lệ.)

Thông tin liên quan duy nhất thể giúp bạn sửa lỗi là theo dõi ngăn xếp mà bạn không nhận được bằng mã lỗi. (Tôi cũng cho rằng bạn muốn sử dụng mã lỗi cho các báo cáo lỗi và không ném chúng vào mặt người dùng.)


Điều đó rất đúng, và tôi làm điều đó, nhưng tôi sẽ nói gì với người dùng? Tôi chắc chắn rằng họ sẽ sống động nếu họ bán hàng rong và ứng dụng chỉ chết, không có lời giải thích hay bất cứ điều gì để bốc khói.
ahodder

6
Tôi nghĩ rằng có ít nhất ba điều khác nhau bị lẫn lộn ở đây. Đầu tiên là các mã được sử dụng từ phần mềm đến phần mềm, như trong HTTP. Thứ hai là các mã mà người dùng có thể sử dụng trong báo cáo lỗi (như số sự cố). Cuối cùng là những tin nhắn có thể được hiển thị cho người dùng. Nó có thể giúp coi chúng là những thứ riêng biệt.
Darien

2
Một lý do lớn để sử dụng mã lỗi là khi bạn đang xây dựng một ứng dụng phụ. Việc chương trình máy khách diễn giải và trả lời mã dễ dàng và thanh lịch hơn nhiều so với thông báo lỗi hoặc theo dõi ngăn xếp. Không phải tất cả các lỗi là từ lỗi.
Kaypro II

1
Ngoại lệ là rất khó khăn để có được quyền! Xem các liên kết trong: lập trình
viên.stackexchange.com / questions / 97874 / Giả

@Coder: ví dụ của bạn lạm dụng các ngoại lệ. Bạn nên nắm bắt những gì bạn mong muốn được ném . Hầu hết các phương pháp không cần phải mong đợi ngay cả một ngoại lệ duy nhất được đưa ra. Đó hoàn toàn là trách nhiệm của lập trình viên trong việc quyết định xử lý cái gì và tôi đồng ý rằng có thể khó để làm cho đúng .
Dan

2

Tôi sẽ giả định một bối cảnh thủ tục (C). Nếu bạn có các đối tượng, một đối tượng lỗi thường tốt hơn, cho dù có ngoại lệ hay không.

Bạn nên sử dụng mã lỗi cục bộ cho mỗi mô-đun. Đối với thư viện, bạn có thể có một tiêu đề đặc biệt liệt kê các mã lỗi, với số 1, 2, v.v (hoặc -1, -2 nếu bạn thích). Đảm bảo luôn trả về một trong các mã này, ví dụ: dịch errnosang mã của riêng bạn. Nếu bạn có nhiều lớp mô-đun, hãy dịch ở mỗi bước (hoặc xác định trước một phạm vi cho lỗi sâu hơn, ví dụ: các giá trị 1001 - 1050 là từ mô-đun khác đó).

Điều quan trọng nữa là bạn cung cấp một phương tiện để dịch mã thành một chuỗi. Bạn không bao giờ nên chỉ báo cáo mã, điều đó chỉ dẫn đến sự thất vọng. Trên thực tế, khá nhiều mã trong ứng dụng của bạn phải đi kèm với chức năng dịch chuỗi. Ví dụ libc thường có strerrorstrsignal, nhưng đáng buồn là thiếu strwaitstatus.


chi tiết tuyệt vời, cảm ơn bạn. Điều này thực sự hữu ích.
ahodder
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.