Terus mengejutkan saya bahwa, di zaman sekarang ini, produk-produk yang telah bertahun-tahun digunakan di bawah ikat pinggang mereka, dibangun oleh tim profesional, masih sampai hari ini - gagal memberikan pesan kesalahan yang bermanfaat kepada pengguna. Dalam beberapa kasus, penambahan sedikit informasi tambahan dapat menghemat waktu pengguna.
Program yang menghasilkan kesalahan, membuatnya karena suatu alasan. Ia memiliki segalanya untuk menginformasikan pengguna sebanyak mungkin, mengapa sesuatu gagal. Namun tampaknya memberikan informasi untuk membantu pengguna adalah prioritas rendah. Saya pikir ini adalah kegagalan besar.
Salah satu contohnya adalah dari SQL Server. Ketika Anda mencoba dan mengembalikan database yang sedang digunakan, itu benar tidak akan membiarkan Anda. SQL Server tahu proses dan aplikasi apa yang mengaksesnya. Mengapa tidak bisa memasukkan informasi tentang proses yang menggunakan database? Saya tahu tidak semua orang memberikan Applicatio_Name
atribut pada string koneksi mereka, tetapi bahkan petunjuk tentang mesin tersebut dapat membantu.
Kandidat lain, juga SQL Server (dan mySQL) adalah string or binary data would be truncated
pesan kesalahan yang indah dan setara. Banyak waktu, teliti pernyataan SQL yang dihasilkan dan tabel menunjukkan kolom mana yang menjadi biang keladinya. Ini tidak selalu terjadi, dan jika mesin database mengambil kesalahan, mengapa itu tidak bisa menyelamatkan kita saat itu dan hanya memberi tahu kita kolom terkutuk itu? Pada contoh ini, Anda dapat berargumen bahwa mungkin ada hit kinerja untuk memeriksanya dan bahwa ini akan menghalangi penulis. Baik, saya akan membelinya. Bagaimana, setelah mesin basis data tahu ada kesalahan, ia melakukan perbandingan cepat setelah fakta, antara nilai-nilai yang akan disimpan, versus panjang kolom. Kemudian tampilkan itu ke pengguna.
ASP.NET, Table Adapters juga bersalah. Kueri dapat dieksekusi dan satu dapat diberikan pesan kesalahan yang mengatakan bahwa suatu kendala di suatu tempat dilanggar. Terima kasih untuk itu. Saatnya membandingkan model data saya dengan basis data, karena pengembang terlalu malas untuk memberikan bahkan nomor baris, atau contoh data. (Sebagai catatan, saya tidak akan pernah menggunakan metode akses data ini karena pilihan , itu hanya proyek yang saya warisi!).
Setiap kali saya melemparkan pengecualian dari kode C # atau C ++ saya, saya memberikan semua yang saya miliki kepada pengguna. Keputusan telah dibuat untuk membuangnya, sehingga semakin banyak informasi yang dapat saya berikan, semakin baik. Mengapa fungsi saya membuang pengecualian? Apa yang diteruskan, dan apa yang diharapkan? Hanya perlu waktu sedikit lebih lama bagi saya untuk memasukkan sesuatu yang bermakna ke dalam tubuh pesan pengecualian. Sial, itu tidak membantu saya sementara saya berkembang, karena saya tahu kode saya melempar hal-hal yang bermakna.
Orang dapat berpendapat bahwa pesan pengecualian yang rumit tidak boleh ditampilkan kepada pengguna. Sementara saya tidak setuju dengan itu, itu adalah argumen yang dapat dengan mudah diredakan dengan memiliki tingkat verbositas yang berbeda tergantung pada build Anda. Bahkan kemudian, para pengguna ASP.NET dan SQL Server bukan pengguna tipikal Anda, dan akan lebih suka sesuatu yang penuh dengan informasi verbal dan lezat karena mereka dapat melacak masalah mereka lebih cepat.
Mengapa para pengembang berpikir tidak apa-apa, di zaman sekarang ini, untuk menyediakan jumlah minimum informasi ketika terjadi kesalahan?
Ini 2011 orang, datang pada .
sumber
Jawaban:
Meskipun ada banyak contoh pesan kesalahan buruk yang seharusnya tidak terjadi, Anda harus ingat bahwa tidak selalu mungkin untuk memberikan informasi yang ingin Anda lihat.
Ada juga kekhawatiran tentang mengekspos terlalu banyak informasi, yang dapat menyebabkan pengembang melakukan kesalahan dengan hati-hati. (Saya berjanji kepada Anda bahwa permainan kata-kata tidak dimaksudkan, tetapi saya tidak menghapusnya sekarang karena saya sudah menyadarinya.)
Terkadang, ada juga fakta bahwa pesan kesalahan yang kompleks tidak berguna bagi pengguna akhir. Berpihak pada informasi yang berlebihan tidak selalu merupakan pendekatan yang baik untuk pesan kesalahan. (Itu mungkin lebih baik disimpan untuk logging.)
sumber
For further information, see log20111701.txt
. Ini akan menjadi langkah ke arah yang benar.Pengembang bukan orang yang tepat untuk menulis pesan kesalahan.
Mereka melihat aplikasi dari sudut yang salah. Mereka sangat menyadari apa yang salah di dalam kode, tetapi sering tidak mendekati perangkat lunak dari sudut pandang mencoba mencapai sesuatu. Akibatnya, informasi apa yang penting bagi pengembang belum tentu informasi penting bagi pengguna.
sumber
Pandangan amal:
Pengembang bekerja erat dengan kode dan berjuang untuk memahami seseorang yang tidak memiliki pemahaman mereka bekerja dengannya. Akibatnya mereka berpikir pesan kesalahan baik-baik saja, mereka hanya tidak memiliki kerangka referensi yang baik untuk menilai mereka.
Pesan kesalahan cerdas sebenarnya sulit dilakukan. Tidak hanya menulisnya tetapi Anda harus memikirkan semua yang mungkin salah, menilai kemungkinan dan memberikan informasi yang berguna (yang hampir pasti bervariasi berdasarkan konteksnya) kembali kepada orang yang membaca pesan untuk memungkinkan mereka memperbaikinya.
Untuk sebagian besar aplikasi, sulit untuk membuat kasus yang baik untuk saat ini untuk melakukan hal seperti ini dan pengembang berikutnya akan sangat suka karena kesalahan tidak sering terjadi. Selain itu, jika Anda memiliki waktu ekstra itu, bukankah seharusnya Anda habiskan untuk menghentikan kesalahan daripada melaporkannya?
Tampilan yang tidak bisa ditiru:
Kenyataannya mungkin di suatu tempat di tengah, meskipun pengalaman saya sebenarnya mengatakan itu jauh lebih tua daripada yang kemudian - pada dasarnya itu sebenarnya cukup sulit dan membutuhkan upaya yang cukup banyak untuk menangani sesuatu yang mungkin tidak akan terjadi.
sumber
Process Handle Raped By Spawned Injector, Quitting SYstem.
.... pengguna: "wtf apa yang saya lakukan?`). Tetapi dalam kasus SQL Server / ASP.NET, saya pikir lebih banyak upaya dapat dilakukan :)string/binary data
kesalahan yang menarik semua informasi kolom dari tabel tersebut, memeriksa nilai-nilai masa lalu dan menunjukkan kolom mana yang akan dilanggar. Ini sepele. Mungkin saya terlalu banyak menggerutu karena contoh-contoh kasus saya sepele, tetapi saya benar-benar mengerti bahwa ini tidak selalu terjadi. Bagaimana kita menghentikan suntikan yang muncul dari proses pemerkosaan mungkin sulit :)Sayangnya, pesan kesalahan yang lebih bermanfaat menghabiskan waktu pengembang, yang sama dengan uang perusahaan. Produk cukup mahal untuk dibangun. Ya, itu akan luar biasa untuk memiliki pesan kesalahan yang lebih bermanfaat, dan saya setuju bahwa harus ada yang lebih bermanfaat termasuk. Namun, itu hanya fakta kehidupan bahwa ketika Anda berada di bawah tenggat waktu, dan uang ada di telepon, Anda harus memotong sesuatu. "Pesan kesalahan yang lebih cantik" seperti yang mungkin dilihat oleh manajer, kemungkinan akan menjadi hal pertama yang dilakukan.
sumber
Saya setuju bahwa pesan kesalahan harus sespesifik mungkin.
Salah satu alasan untuk pesan kesalahan umum mungkin adalah penggunaan kode kesalahan. Saat menggunakan pengecualian, Anda bebas untuk lulus semua yang Anda butuhkan dalam pesan kesalahan. Menggunakan kode kembali tidak ada ruang untuk menyandikan nama kolom. Mungkin kesalahan ditangani oleh fungsi generik yang tidak tahu konteksnya dan hanya menerjemahkan kode kesalahan ke string.
sumber
sumber
Sebagai pemberitahuan umum, Anda harus mempertimbangkan bahwa setiap kesalahan atau situasi luar biasa adalah - persis itu: luar biasa. Ini memotong prosedur yang direncanakan dan dirancang. Ini tidak sesuai dengan cara hal-hal yang direncanakan untuk bekerja. Jika ini bukan masalahnya, maka tidak perlu ada jaminan dengan pembatalan kesalahan.
Kami programmer dilatih untuk melindungi diri dari prosedur yang direncanakan ini. Dengan demikian, kami secara rutin menyertakan beberapa pemeriksaan kewarasan untuk memverifikasi asumsi kami. Ketika cek kewarasan ini gagal, kita hanya tahu bahwa rencana itu entah bagaimana gagal ...
Permintaan Anda - mungkin terlihat seperti akal sehat dari sudut pandang pengguna - tidak mungkin dipenuhi, jika Anda mempertimbangkan kenyataan bagaimana sistem seperti itu bekerja. Anda meminta pernyataan tertib dengan informasi yang terorganisir dengan baik dan sesuai ditambahkan. Selain itu, Anda bahkan meminta agar presentasi ini terjadi dengan cara yang sesuai dengan aplikasi umum / desain penanganan. Jelas informasi ini ada di suatu tempat di sistem. Jelas itu bahkan ada di sana secara teratur dan terorganisir dengan baik (mari kita berharap begitu). TETAPI pada titik kesalahan terjadi, tidak ada yang pernah berencana untuk membuat informasi ini tersedia. Kesalahan selalu merupakan hilangnya sebagian kontrol.Kehilangan kendali ini dapat terjadi pada berbagai tingkatan. Bisa jadi sistem berperilaku saat runtime berbeda dari yang direncanakan. Tetapi bisa juga bahwa implementasi aktual ternyata jauh lebih sulit dan berbeda dalam rincian yang direncanakan, dan tidak ada ketentuan yang digerakkan untuk menangani situasi ini dengan memuaskan. Ini juga merupakan kehilangan sebagian kontrol.
Untuk mengaitkan ini dengan contoh konkret yang Anda berikan: Jika, pada titik kesalahan, nama dan jenis kolom tabel akan diketahui, dan selain panjang ruang yang dibutuhkan, maka tidak akan ada alasan untuk meningkatkan kesalahan, bukan? Kami hanya bisa memperbaiki situasi dan melanjutkan sesuai rencana. Kenyataan bahwa kita dipaksa untuk membuat kesalahan menunjukkan kepada kita bahwa segala sesuatunya tersesat. Fakta bahwa informasi ini tidak ada adalah pengecualian .
Apa yang saya tulis di sini mungkin tampak jelas dan masuk akal. Namun dalam kenyataannya sangat sulit untuk dipahami. Kami terus berusaha memahaminya dengan menerapkan kategori moral - seperti harus ada pelakunya, harus ada orang malas yang buruk yang tidak peduli pada pengguna yang buruk, harus ada pengusaha serakah yang melakukan cara perhitungan murah. Semua ini benar-benar tidak penting
Kemungkinan kehilangan kendali berasal dari fakta bahwa kami melakukan sesuatu dengan cara yang terencana dan teratur .
sumber
Saya bekerja sebagai insinyur pendukung untuk perusahaan perangkat lunak dan seringkali kita melihat pesan kesalahan yang baru bagi kami. Seringkali ketika saya merujuk ini kembali ke tim pengembangan kami, mereka harus mencari pesan di sumber aplikasi.
Menurut saya, bahkan jika itu tidak disajikan kepada pengguna, akan banyak waktu yang aman bagi kami jika tim pengembang akan menambahkan catatan ke indeks pesan kesalahan atau basis data setiap kali mereka menambahkan yang baru itu akan membuatnya jauh lebih cepat bagi kita untuk menemukan penyebab masalah pelanggan dan menghemat waktu mereka juga ...
sumber
Masalah yang Anda lihat sebenarnya adalah salah satu efek samping dari enkapsulasi dan penyembunyian informasi yang tepat.
Sistem modern sangat rumit. Ada sedikit kemungkinan bahwa pengembang rata-rata mampu memegang, di kepalanya, model mental dari seluruh sistem dari UI ke biner mentah saat dia sedang mengkode tugas tertentu.
Jadi, ketika seorang pengembang sedang duduk dan mengkodekan, katakanlah, bit yang mengembalikan file database, model mentalnya dipenuhi sepenuhnya dengan bit yang mengelilingi tindakan memulihkan file database. Dia perlu (dan saya kira, saya belum menulis kode ini) membaca file, memeriksa properti, membaca versi, membuat cadangan data yang ada, memilih strategi gabungan / menimpa, dll. Kemungkinan besar, jika ada bahkan sebuah passing pertimbangan ke UI, itu dalam string kesalahan yang ia tulis dalam penangan pengecualian. Sesuatu seperti:
Dalam contoh ini, informasi bermanfaat yang Anda tanyakan dalam hal proses yang mungkin menggunakan file, atau bahkan utas lainnya dalam DB, sepenuhnya berada di luar ruang lingkup (secara programatik). Mungkin ada ratusan kelas yang menangani file DB; mengimpor ke kelas-kelas informasi tentang setiap proses lain menggunakan file, atau fungsi untuk mengakses sistem file dan melihat proses lain yang berjalan (dengan asumsi proses-proses tersebut bahkan pada mesin INI) akan menghasilkan apa yang dikenal sebagai abstraksi bocor ; ada biaya langsung dalam produktivitas.
Jadi begitulah kesalahan semacam ini dapat bertahan di zaman modern. Jelas, mereka semua BISA diperbaiki; tetapi dalam banyak kasus, ada banyak overhead yang terlibat daripada yang diperkirakan (dalam kasus ini misalnya, Anda mungkin harus memiliki fungsi ini melintasi enumerasi koneksi jaringan dan berbagi untuk melihat apakah mesin jarak jauh menggunakan file database ini untuk beberapa alasan) dan biayanya jauh dari sepele.
sumber
GenericException
, saya bisa 1) TanyakanProcesses
Subsistem untuk daftar proses. 2) Tanyakan setiap proses, basis data apa yang mereka gunakan. 3) Cocokkan proses dengan database yang ditugaskan ke yang saya coba timpa, 4) melemparkanDatabaseInUse(dbName, processName, applicationName
pengecualian. :)Favorit saya adalah (kembali pada akhir 70-an) kompiler Univac Fortran IV, ketika membaca non-digit, dengan setia diumumkan
sumber
Saya percaya sebagian besar pesan kesalahan sebenarnya programmer (self) berorientasi kode dimuliakan debugging / pernyataan printf.
Menulis pesan kesalahan berorientasi pengguna berarti mengetahui siapa pengguna Anda, dan mengantisipasi apa yang ingin mereka ketahui. Sementara di tengah penulisan kode, pengembang lebih cenderung untuk menulis pesan kesalahan yang berguna bagi diri mereka sendiri, baik untuk debugging kode yang mereka tulis saat ini, atau berguna untuk Kasus Penggunaan yang diketahui atau mendominasi.
Beralih dari menulis kode ke mendesain bagian tekstual dari antarmuka pengguna (atau pengalaman pengguna) adalah saklar konteks. Dalam aplikasi besar, seperti aplikasi multibahasa yang bisa berarti itu diserahkan kepada orang atau tim yang berbeda (UI, terjemahan) daripada sepenuhnya ditangani oleh pengembang, jadi kecuali pengembang hati-hati menjelaskan konteks pesan, rincian penting dapat mudah hilang.
Tentu saja, memeriksa dan memverifikasi penanganan kesalahan sering dianggap sebagai prioritas rendah, selama kesalahan & pengecualian ditangani (yaitu tertangkap), tidak banyak penekanan diberikan padanya. Ini adalah tempat basis kode untuk pengembang atau QA yang tidak mendapat penghargaan secara mental, karena kondisi kesalahan sering memiliki konotasi negatif (mis. Kesalahan atau kegagalan) yang terkait dengannya.
sumber
Saya pikir alasannya adalah bahwa pelaporan kesalahan / penanganan selalu dilakukan setelah pemikiran . Bahkan ketika mereka tidak sepenuhnya setelah berpikir, mereka sebagian besar warga negara kelas dua dalam desain keseluruhan.
Perangkat lunak modern biasanya terdiri dari banyak lapisan. Ketika logika pelaporan kesalahan Anda disusun dengan terburu-buru tanpa terlalu banyak berpikir, seringkali sulit untuk mengumpulkan semua informasi yang diperlukan untuk menyajikan pesan kesalahan yang berguna.
Misalnya, kesalahan ditangkap di back-end, tetapi perlu beberapa informasi dari lapisan yang lebih tinggi untuk menyusun pesan kesalahan yang komprehensif. Sebagian besar pesan kesalahan yang baik memerlukan informasi dari hampir semua lapisan (untuk memberi kami pandangan komprehensif tentang apa yang terjadi dalam sistem). Pesan kesalahan yang ideal akan terlihat seperti "OK, kami pertama menerima string, kemudian melewati parser yang memberi sesuatu yang lucu, Anda mungkin ingin melihat di sana. Lagi pula, benda itu diteruskan ke bawah ..."
Melakukannya akan sering memerlukan kopling yang tidak perlu jika mekanisme pelaporan kesalahan bukan warga negara kelas satu selama fase desain. Saya kira kebanyakan orang hanya menemukan bahwa terlalu banyak pekerjaan yang harus dilakukan untuk sesuatu yang tidak terlihat mengesankan (yang suka mengatakan "Lihat? Program saya macet, dan pesan kesalahannya berguna!").
sumber