Bagaimana Anda menetapkan kode kesalahan?

13

Bagaimana, ketika mengembangkan proyek berukuran sedang, apakah Anda mengidentifikasi, membuat, dan memelihara kode kesalahan?

Saya seumur hidup tidak bisa memikirkan metode yang sederhana dan bersih untuk melakukannya. Beberapa ide saya mengubah nama kelas dan nama metode menjadi string integer, tetapi itu adalah cara yang lama untuk ditampilkan kepada pengguna di atas fakta bahwa nama metode dan nama kelas dapat berubah (mudah-mudahan tidak!). Yang lain hanya menggunakan sistem log yang bertambah (mis. Kapan pun saya membuat pesan kesalahan baru, tambahkan saja 1 ke id pesan kesalahan terakhir). Tapi itu sama sekali tidak terorganisir.

Untuk lebih spesifik saya berbicara tentang kode kesalahan seperti:

Error 401 Unauthorized.

ahodder
sumber
1
kode kesalahan? Seperti "angka ajaib"? Misalnya ... KESALAHAN 001. Kemudian Anda pergi ke daftar dan membaca KESALAHAN 001 berarti bahwa bla bla bla ... Ya?
wleao
@wleao - Yessir. Saya akan mengedit pertanyaan saya untuk mencakup itu. Terima kasih.
ahodder
Seperti yang Anda edit dalam pertanyaan Anda. Lihatlah bagaimana mereka melakukannya dengan http. Saya tidak tahu apakah itu ide yang baik untuk menggunakan angka ajaib sama sekali. Namun, jika Anda benar-benar mau melakukannya, ikuti konsep mereka. Misalnya, mereka memiliki taksonomi kesalahan (apakah Anda memilikinya?).
wleao
@ Willao - belum, tapi terima kasih kepada Anda dan Péter Török, saya pasti akan membuatnya. :)
ahodder

Jawaban:

16

Tidak.

Kode kesalahan adalah sebuah anakronisme, mereka berasal dari masa lalu ketika output sangat sulit dan mahal, dan satu-satunya cara untuk memberi sinyal kondisi kesalahan mungkin melalui sekelompok lampu panel depan: pdp11 / 70 panel depan

Hari-hari ini, kami memiliki penanganan pengecualian matang yang dibangun ke hampir setiap bahasa utama. Gunakan. Berikan informasi pengguna mereka dapat bekerja dengan; jangan ganggu mereka dengan bla-bla teknis, tetapi katakan secara kasar apa yang salah dan apa yang bisa mereka lakukan. Untuk login, cukup berikan nama deskriptif pengecualian Anda, dan catat namanya. Lebih mudah diingat, dan juga lebih mudah ditemukan menggunakan grep atau alat pencarian serupa.

Pengecualian, tentu saja, ketika Anda memprogram untuk situasi di mana output masih sulit dan mahal, seperti embedded system atau protokol jaringan. HTTP masih menggunakan kode respons numerik karena sangat mudah diurai secara efisien - dalam beberapa situasi, membaca hanya digit pertama sudah cukup memberi tahu Anda, dan Anda dapat membuang sisa paket.

tammmer
sumber
Terima kasih atas jawaban terinci, itu masuk akal dan baik untuk diketahui.
ahodder
Penggunaan ilustrasi Anda sangat cocok dengan argumen Anda. Saya sudah membaca tentang PDP-11 selamanya. Tapi ini sebenarnya yang pertama yang pernah saya lihat. Terima kasih.
Mike Owens
2
Di dalam kode, saya lebih suka menangani kode kesalahan dan saya tidak terlalu tua.
JeffO
@ Jeff: Apa pun yang dapat Anda lakukan dengan kode kesalahan juga dapat dilakukan dengan pengecualian, dan kemudian sedikit lagi. Jika Anda ingin meniru kode kesalahan dengan pengecualian, semua yang perlu Anda lakukan adalah melempar alih-alih mengembalikan kode kesalahan, dan menangkap alih-alih membandingkan nilai balik terhadap E_OK (atau apa pun respons OK). Agar adil, C tidak memiliki pengecualian nyata, dan longjumps tidak nyaman, jadi jika Anda melakukan C, Anda agak dimaafkan.
tdammers
@ Mike: Gambar ini berasal dari artikel wikipedia pada seri PDP-11; jika itu tidak mudah ditemukan, saya tidak tahu apa itu.
tdammers
6

Anda harus memeriksa bagaimana kode kesalahan / status diatur dalam protokol umum seperti HTTP . Mereka memiliki rentang yang berbeda untuk berbagai jenis status / kesalahan. Ini memudahkan pengguna untuk mengidentifikasi kode status yang tidak dikenal, dan bagi pengembang untuk menetapkan kode untuk jenis kesalahan baru yang belum pernah ditangani sebelumnya.

Péter Török
sumber
Tambahkan ke jawaban Anda hal taksonomi. Ini akan membuat segalanya lebih mudah untuk mengelola dan memelihara kesalahan.
wleao
3

Maaf, mengapa menggunakan kode kesalahan sama sekali?
Tangkap pengecualian, catat dan tawarkan untuk mengirim laporan jika program tidak dapat pulih .

(Dengan asumsi bahasa Anda mendukung pengecualian.)

Satu-satunya informasi yang relevan yang mungkin membantu Anda memperbaiki bug adalah jejak tumpukan yang tidak Anda dapatkan dengan kode kesalahan. (Saya juga berasumsi Anda ingin menggunakan kode kesalahan untuk laporan kesalahan dan tidak membuangnya ke wajah pengguna.)

Dan
sumber
Itu sangat benar, dan saya melakukan itu, tetapi apa yang akan saya katakan kepada pengguna? Saya yakin mereka akan marah jika mereka menjajakan dan aplikasi hanya mati, tidak ada penjelasan atau apa pun untuk marah.
ahodder
6
Saya pikir setidaknya ada tiga hal berbeda yang membingungkan di sini. Yang pertama adalah kode yang digunakan dari-peranti lunak ke peranti lunak, seperti dalam HTTP. Yang kedua adalah kode yang dapat digunakan pengguna dalam laporan kesalahan (seperti nomor insiden). Yang terakhir adalah pesan yang dapat ditampilkan kepada pengguna. Mungkin membantu untuk menganggapnya sebagai hal yang terpisah.
Darien
2
Salah satu alasan utama untuk menggunakan kode kesalahan adalah ketika Anda sedang membangun aplikasi back end. Jauh lebih mudah dan lebih elegan untuk program klien untuk menafsirkan dan merespons kode daripada pesan kesalahan atau tumpukan jejak. Tidak semua kesalahan berasal dari bug.
Kaypro II
1
Pengecualian sangat sulit untuk diperbaiki! Lihat tautan di: programmers.stackexchange.com/questions/97874/…
Coder
@ Kode: contoh Anda menyalahgunakan pengecualian. Anda harus menangkap apa yang Anda harapkan untuk dibuang . Kebanyakan metode tidak perlu mengharapkan bahkan satu pengecualian dilemparkan. Ini sepenuhnya tanggung jawab programmer untuk memutuskan apa yang harus ditangani dan saya setuju mungkin sulit untuk memperbaikinya .
Dan
2

Saya akan menganggap konteks prosedural (C). Jika Anda memiliki objek, objek kesalahan biasanya lebih baik, apakah pengecualian atau tidak.

Anda harus menggunakan kode kesalahan lokal untuk setiap modul. Untuk pustaka Anda dapat memiliki tajuk khusus yang mencantumkan kode kesalahan, dengan angka 1, 2 dll (atau -1, -2 jika Anda suka). Pastikan untuk selalu mengembalikan salah satu kode ini, mis. Terjemahkan errnoke dalam kode Anda sendiri. Jika Anda memiliki banyak lapisan modul, terjemahkan pada setiap langkah (atau tentukan rentang untuk kesalahan yang lebih dalam, misalnya nilai 1001 - 1050 berasal dari modul lainnya).

Penting juga bahwa Anda menyediakan sarana untuk menerjemahkan kode menjadi string. Anda tidak boleh hanya melaporkan kode, yang hanya mengarah pada frustrasi. Sebenarnya hampir semua kode dalam aplikasi Anda harus datang dengan fungsi terjemahan string. Misalnya libc biasanya memiliki strerrordan strsignal, tetapi sayangnya kurang strwaitstatus.

Per Johansson
sumber
detail yang fantastis, terima kasih. Ini sebenarnya sangat membantu.
ahodder