Geliştiricinin yardımcı hata iletilerindeki sorunları nelerdir? [kapalı]


29

Bu gün ve yaşta, kayışları altında yıllarca kullanılan, profesyonel ekipler tarafından inşa edilen ve halen bu güne kadar olan ürünlerin, kullanıcıya yararlı hata mesajları vermemesi beni şaşırtmaya devam ediyor . Bazı durumlarda, yalnızca küçük bir miktar ek bilgi eklenmesi, kullanıcının saatlerce sorun çıkarmasını sağlayabilir.

Hata üreten bir program, bir sebepten dolayı üretti. Kullanıcıya olabildiğince, neden bir şeylerin başarısız olduğunu bildirmek için elinden gelen her şey var. Ve yine de, kullanıcıya yardımcı olacak bilgilerin sağlanmasının düşük öncelikli olduğu görülmektedir. Bunun çok büyük bir başarısızlık olduğunu düşünüyorum.

Bir örnek SQL Server'dan. Kullanımda olan bir veritabanını geri yüklemeye çalıştığınızda, tam olarak size izin vermez. SQL Server, hangi işlemlerin ve uygulamaların buna eriştiğini biliyor Neden veritabanını kullanan işlemler hakkında bilgi içeremiyor? Herkesin Applicatio_Namebağlantı dizgisinde bir öznitelik geçirmediğini biliyorum , ancak söz konusu makine hakkında bir ipucu bile yardımcı olabilir.

Başka bir aday, ayrıca SQL Server (ve mySQL), sevimli string or binary data would be truncatedhata mesajı ve eşdeğerleridir. Çoğu zaman, oluşturulan SQL deyiminin basit bir algı ve tablo hangi sütunun suçlu olduğunu göstermektedir. Bu her zaman böyle değildir ve eğer veritabanı motoru hata yaptıysa, neden bize o zaman kazandırmıyor ve sadece hangi lanet olası sütunun olduğunu söylüyor? Bu örnekte, onu kontrol etmede bir performans çarpması olabileceğini ve bunun yazarı engelleyebileceğini iddia edebilirsiniz. Tamam, onu alacağım. Veri tabanı motoru bir hata olduğunu anladıktan sonra, depolanacak değerler ile sütun uzunlukları arasında gerçek bir karşılaştırma yapar. Sonra bunu kullanıcıya göster.

ASP.NET'in korkunç Tablo Adaptörleri de suçlu. Sorgular çalıştırılabilir ve bir yere bir kısıtlamanın ihlal edildiğini söyleyen bir hata mesajı verilebilir. Bunun için teşekkürler. Veri modelimi veri tabanıyla karşılaştırma zamanı, çünkü geliştiriciler bir satır numarası veya örnek veri bile sağlayamayacak kadar tembeldir. (Kayıt için, bu veri erişim yöntemini asla seçerek kullanmadım , bu sadece kalıtımsal bir proje!).

Ne zaman bir C # veya C ++ kodumdan bir istisna atsam, elimde olan her şeyi kullanıcıya veriyorum. Atma kararı verildi, böylece ne kadar çok bilgi verebilirim, o kadar iyi. İşlevim neden bir istisna attı? Ne geçti, ne bekleniyordu? Bir istisna mesajının gövdesine anlamlı bir şey koymak biraz daha uzun sürüyor. Kahretsin, geliştirirken bana yardım etmekten başka bir şey yapmıyor , çünkü kodumun anlamlı şeyler attığını biliyorum.

Birisi karmaşık istisna mesajlarının kullanıcıya gösterilmemesi gerektiğini iddia edebilir. Buna katılmıyorum, ancak yapınıza bağlı olarak farklı bir ayrıntı düzeyine sahip olarak kolayca düzeltilebilecek bir argüman. O zaman bile, ASP.NET ve SQL Server kullanıcıları tipik kullanıcılarınız değildir ve problemlerini daha hızlı takip edebildiklerinden, ayrıntılarıyla ve nefis bilgiyle dolu bir şeyi tercih ederler.

Geliştiriciler bu gün ve yaşta, bir hata meydana geldiğinde en az miktarda bilgiyi sağlamanın tamam olduğunu düşünüyorlar?

Bu 2011 adamlar, gel üzerinde .


11
Vay canına, çok rant.
George Marian

3
@George, doğru bir hata verildiğinde daha hızlı çözülebilecek bir şeyi izleyerek uzun zaman harcadığımı söyleyebilir misiniz? :)
Moo-Juice

4
Derin nefesler, belki biraz yoga ve meditasyon öneririm. :) (Dedi ki, nasıl hissettiğinizi tam olarak biliyorum.)
George Marian

2
+1 - "dize veya ikili veriler kesiliyor" her zaman beni deli ediyor!
k25

Yanıtlar:


22

Olmaması gereken birçok hata mesajı örneği varken, görmek istediğiniz bilgiyi sağlamanın her zaman mümkün olmadığını aklınızda tutmalısınız.

Ayrıca geliştiricilerin dikkatli olmalarına neden olabilecek çok fazla bilginin açığa çıkması konusunda da endişeler var. (Sana söz veriyorum ki bu amaçlanmadı, ama şimdi fark ettim ki çıkarmıyorum)

Bazen, karmaşık bir hata mesajının son kullanıcı için işe yaramaz olduğu gerçeği de vardır. Bilgi yüklemesi ile dış cephe kaplaması, hata mesajları için mutlaka iyi bir yaklaşım değildir. (Bu, günlük kaydı için en iyi yol olabilir.)


+1 Bilgi yüklemesi yönünü bile düşünmedim.
Ryan Hayes

Gönderimde neden bazılarının bir son kullanıcıya karşı kısırlığın onlar için yararsız olabileceğini düşündüğümü anladım. Ancak bir API (ag ASP.NET'in adaptörleri) veya bir veritabanı motorunun (SQL-Server) son kullanıcılarının ayrıntılı hatalar istemediklerini mi söylüyorsunuz ? Bizi potansiyel olarak saatlerce zaman kaybetmekten kurtarabilecek bir şey? Bu arada oyunu beğendim :)
Moo-Juice

1
@George, aynı zamanda aşırı bilgi yüklemesi ve son kullanıcıya faydası açısından da, bir kelime-işlemcinin kullanıcısına tam bir yığın-iz bırakmamak için bir durum görebiliyorum. ve interneti sildiklerini düşünüyorlar. Bununla birlikte, günlük dosyasındaki karmaşık bilgilerle mükemmel bir alternatif sunmuşsunuzdur. Bu mesajın şimdi yapması gereken tek şey eklemek For further information, see log20111701.txt. Bu doğru yönde bir adım olacaktır.
Moo-Juice

2
@ moo Sonuçta, söylediğim şey eleştirmek kolay. (Biliyorum, sık sık yaparım.) Ancak, bir hata iletisine ne kadar bilgi ekleyeceğinizi söylemenizin kesinlikle kolay olmadığını unutmayın. Hata ayıklama sırasında ilk başta beklediğimden daha ayrıntılı bilgi geri almak ve yazdırmak zorunda kaldığım birçok kez var. Ayrıca, bir hata mesajının oluştururken beklediğim kadar yararlı olmadığı birçok zaman vardır.
George Marian

1
@ moo Sorunun temel noktası, ne kadar bilginin faydalı olacağı her zaman açık olmamasıdır. Verdiğiniz örnekler oldukça açık görünüyor. Ancak, bunu genel davaya genişletmek kolay değildir.
George Marian,

21

Geliştiriciler hata mesajları yazan doğru kişiler değildir.

Uygulamayı yanlış açıdan görüyorlar. Kod içinde neyin yanlış gittiğinin son derece farkındalar, ancak genellikle bir şeyi başarmaya çalışmak açısından yazılıma yaklaşmıyorlar. Sonuç olarak, geliştirici için önemli bilgilerin kullanıcı için mutlaka önemli bir bilgi olması gerekmez.


Hataların Çerçeve / API türlü Bir sürü 1, konunun parçası kütüphanesinin geliştiricisi edemez bağlamı biliyoruz. Bununla birlikte, OP çoğunlukla "bir şeylerin yanlış olduğu, ancak bildiğim halde size nerede olduğunu söyleyemem" türleriyle ilgili hata mesajı türleriyle ilgili görünmektedir. Sanırım bu güvenlik, değil mi?
MIA

8

Hayırsever bakış açısı:

  • Geliştirici kodla yakından çalıştı ve onunla çalışma anlayışına sahip olmayan birisini anlamakta zorlandı. Sonuç olarak , hata mesajlarının iyi olduğunu düşünüyorlar , sadece onları yargılamak için iyi bir referans çerçevelerine sahip değiller.

  • Akıllı hata mesajları yapmak gerçekten zor. Sadece onları yazmakla kalmaz, aynı zamanda yanlış olabilecek her şeyi de çözmek zorunda kalırsınız, olasılığını değerlendirir ve mesajı düzeltmek için mesajı okuyan kişiye geri dönersek (içeriğe göre neredeyse kesinlikle değişir) yararlı bilgiler sağlarsınız.

  • Çoğu uygulama için, bir sonraki geliştiricinin yanı sıra, bu tür bir şeyi yapmak için iyi bir durum bulmak zordur çünkü hatalar bu kadar sık ​​meydana gelmez. Ayrıca, fazladan zamanınız olsaydı, bunları rapor etmek yerine hataları durdurarak harcamamalı mıydınız?

Koşulsuz görüş:

  • Hata mesajları ve hata yönetimi sıkıcı, üzerinde çalışılacak çok daha ilginç şeyler var ve patronum bir sonraki şey hakkında sırtımda. Bu kodu anlıyorum, iyi olacağım, sıradaki adam sonunda işe yarayacak ve o zamana kadar buradan gideceğim bu yüzden benim sorunum değil.

Gerçek şu ki, muhtemelen ortada bir yerde, benim deneyimim aslında daha sonra olduğundan çok daha eski olduğunu söylüyor - temelde oldukça zor ve muhtemelen olmayacak bir şeyle başa çıkmak için oldukça fazla çaba harcıyor.


Son kullanıcı durumlarında nereden geldiğini anlıyorum. Ancak, asıl gönderimde özetlediğim durumlar veritabanlarına karşı kod yazarken sıkça ortaya çıkabilir. Bir kelime işlemci veya bilgisayar oyunu gibi son kullanıcı uygulamaları ile ilgili olarak, kötü bir şey olmadıkça hatalar genellikle olmamalıdır ve o zaman bile hata son kullanıcıya hiçbir şey ifade etmeyebilir ( Process Handle Raped By Spawned Injector, Quitting SYstem..... user: "wtf yaptım mı?`). Ancak SQL Server / ASP.NET durumunda, daha fazla çaba gösterilebileceğini düşünüyorum :)
Moo-Juice

@ Moo-Suyu - Bence bu "hata mesajlarının zor olması" şeyine bağlı. Kaputun altında, iyimser bir kez yaptıktan sonra veri tabanına gerçekten atılan şey, olayın üzerinde attığınız şeyle tamamen benzerlik gösteriyor. Hatayı tanımlamak bir şeydir, geçtiklerinize ne olduğunu geri izlemek tamamen ve kesinlikle önemsiz değildir.
Jon Hopkins,

bazı davalar önemsiz olmayabilir. string/binary dataTüm sütun bilgilerini söz konusu tablodan alan hatayı yakalayan, geçmiş değerleri inceleyen ve hangi sütunların ihlal edileceğini gösteren basit bir kod parçası . Bu önemsizdi. Belki de çok fazla acı çekiyorum, çünkü vaka örneklerim önemsizdir, ancak bunun her zaman böyle olmadığını tamamen anlıyorum. Yumurtlayan enjektörlerin tecavüz süreçlerinden nasıl uzak durduğumuzu zorlaştırabiliriz :)
Moo-Juice

6

Ne yazık ki, daha yararlı hata mesajları geliştirici zaman maliyeti, bu şirket parasına eşittir. Ürünler olduğu gibi inşa etmek için yeterince pahalı. Evet, daha yararlı hata mesajlarına sahip olmak harika olurdu ve daha faydalı olanlar da olması gerektiğine katılıyorum. Ancak, sadece son tarihin altındayken ve hatta para olduğunda, bir şeyi kesmek zorunda olduğun bir hayat gerçeği. Yöneticilerin görebileceği gibi "Güzel hata mesajları", muhtemelen gidecek ilk şey olacak.


Ah, evet, iyi nokta. Bu şimdiye kadar maliyet endişesi sunar.
George Marian

Bir maliyet perspektifi ödün olabilir (o ve kahretsin ki bunu yapmak zorunda anlamına gelmez gibi o). Ben SQL Server veya ASP.NET geliştiricileri açısından söz edilemez, ama almaz biliyorum o bir sütun adı sağlamak için çok ekstra çaba. Kabul ediyorum, basit bir örnek için, bir saat içinde çözülebileceğini. Daha sonra üretilebilecek diğer 1000 hata var. Fakat en azından sıradan olanlarla başlayabilirler :)
Moo-Juice

Tabii ki SQL server'ın içindekileri tanımıyorum - fakat genel olarak konuşursak, çoğu zaman hata durumunun tespit edildiği noktada bu bilgilere sahip değilsiniz. "String veya binary data" gibi bir formülasyon oldukça açık bir şekilde size hata sitesinde kesilen değerin bir string veya sayı olup olmadığının bile net olmadığını gösteriyor ...
Ichthyo

Bazı seviyelerde bu geçerli olabilir, ancak aynı sorun basitçe $ ekleyen basit perl komut dosyalarında bile ortaya çıkıyor! hata mesajı son derece yararlı olurdu. Bu yazma için (geliştiricinin zaman açısından) daha ucuz şudur: tamamen yararsız yazmak için olandan 'ölmek 'açılamadı $ yolu'' 'kalıp '$ yol $!''
William Pursell

6

Hata mesajlarının mümkün olduğunca spesifik olması gerektiğine katılıyorum.

Genel hata mesajlarının bir nedeni, muhtemelen hata kodlarının kullanılmasıdır. İstisnaları kullanırken, hata mesajında ​​ihtiyacınız olan her şeyi iletmekte özgürsünüz. Dönüş kodlarını kullanarak bir sütun adını kodlayacak yer yoktur. Belki de hata, bağlamı bilmeyen ve sadece hata kodunu bir dizgeye çeviren genel bir işlev tarafından ele alınmaktadır.


daha da kötüsü: hataları çok özel noktalarda tetikleyebiliyorken, hataları ele almak için çeşitli olasılıkları bir durum sınıfına dahil etmek ve bunları tek bir kurtarmayla ele almak zorunda kalırsınız. Bu genelleme eylemi sizi sık sık ek bağlam bilgisinin daha fazlasını atmaya zorlar.
Ichthyo

btw ... bu mekanizma bir sınıf komik hata mesajı veriyor
Ichthyo

4
  • Bazen çok fazla bilgi bir güvenlik riski oluşturabilir; kimin hata mesajı okuduğunu bilmiyorsun
  • Bazen istisnayı ortaya koyan işlem o kadar karmaşıktır ki, kodun hızını / karmaşıklığını olumsuz yönde etkilemeden anlamlı bir mesaj almak mümkün değildir.

İlk noktanızı, kodunuzda atılan istisnalar üzerinde ayrıntılı bir değişikliğe izin vererek cevapladım. İkinci noktanız bu noktada, bir hata oluştuğu ve hızın artık belirleyici bir faktör olmadığı (imho) olmadığı düşünüldü. Ayrıntılı bir hata mesajı üretmek için PRIOR'ın istisnayı atması için performans etkisi gerektiriyorsa kabul ediyorum. İstisna atıldıktan SONRA bu kodu taşıyın. Bu noktaların hiçbirini uygun hata mesajlarına karşı geçerli bir argüman olarak görmüyorum :)
Moo-Juice

Doğru, ben bir şey Diyelim şeyin tutmak parça yerine olanları bir kez bilgi arayabilirsiniz varsayalım olabilir gerekir. Bununla birlikte, iç içe döngüler halinde indeksleri / indeksleri yakalamak sorunlu olabilir.
StuperUser

Kabul etmediğim ilk puan için -1, ikinci puan için +1.
Jon Hopkins,

1
@ jon Oturum açma hataları için genel olarak neyin yanlış gittiğini söyleyen daha belirli hata mesajlarına karşı genel bir hata mesajı ile karşılaştırın. örneğin "Bu kullanıcı adı / şifre kombinasyonunu bulamadık" vs "Yanlış bir şifre girdiniz." / "Bu kullanıcı adı mevcut değil." ASP.NET'teki bir güvenlik açığını, hata iletisinin şifreleme anahtarlarını kırmada gerçekten yararlı olduğu bir yer olduğunu hatırlıyor gibiyim.
George Marian

@George - Bu örneğe katılıyorum ama bunun yaygın olduğunu sanmıyorum. Bir uygulamaya erişim hakkı verildiğinde, kişinin (a) yetkili olduğunu ve (b) fiili uygulamadan ihtiyaç duyulanın çoğunu alabildiğini varsayacağınız gibi belirli bir risk seviyesi ortadan kalkar.
Jon Hopkins,

3

Genel bir not olarak, herhangi bir hatanın veya istisnai durumun - tam olarak şu: istisnai olduğunu göz önünde bulundurmalısınız. Planlanan ve tasarlanan prosedürü keser. Çalışmayı planladığı şeylerle uyumsuz. Eğer durum böyle olmasaydı, iptal edilmeksizin bir hata ile kurtarmaya ihtiyaç duyulmazdı.

Biz programcılar bu planlı prosedürün korunmasını sağlamak için eğitilmişlerdir. Bu nedenle, varsayımlarımızı doğrulamak için düzenli olarak bazı sağlık kontrollerini de dahil ediyoruz. Bu akıl sağlığı kontrolleri başarısız olduğunda, planın bir şekilde başarısız olduğunu biliyoruz ...

Talebiniz - kullanıcının bakış açısından sağduyulu gibi görünebilir - böyle bir sistemin nasıl çalıştığının gerçekliğini düşünüyorsanız, bunu gerçekleştirmek imkansızdır. İyi organize edilmiş ve uygun bilgiler eklenerek düzenli bir açıklama yapmanız istenir . Dahası, bu sunumun genel uygulama / kullanım tasarımına uygun bir şekilde yapılmasını bile talep ediyorsunuz. Açıkçası bu bilgi sistemin bir yerinde var. Açıkçası orada bile düzenli ve iyi organize edilmiş bir şekilde var (umalım öyle olsun). ANCAK , hatanın meydana geldiği noktada, hiç kimse bu bilgileri kullanıma sunmayı planlamamıştır. Bir hata her zaman kısmi bir kontrol kaybıdır.Bu kontrol kaybı çeşitli seviyelerde gerçekleşebilir. Sistemin çalışma zamanında planlanandan farklı davranması olabilir. Ancak, gerçek uygulamanın planlanan detaylarda çok daha zor ve farklı olduğu ve bu durumu tatmin edici şekilde karşılayacak bütçeli bir hüküm olmadığı da olabilir. Bu da kısmi bir kontrol kaybıdır.

Bunu verdiğiniz somut örnekle ilişkilendirmek için: Eğer hata noktasında tablo sütununun adı ve tipi biliniyorsa ve ek olarak gerekli boşluğun uzunluğunu bilseydiniz, bunun için herhangi bir sebep olmazdı. bir hata yapmak, değil mi? Durumu düzeltip planladığımız gibi devam edebiliriz. Bir hatayı yükseltmek zorunda olduğumuz gerçeği bize meselelerin yanlış gittiğini gösteriyor. Bu bilgilerin eldeki olmadığı gerçeği istisnadır .

Burada yazdıklarım kendiliğinden belirgin ve salt sağduyu olarak görünebilir. Fakat gerçekte kavramak son derece zordur. Ahlaki kategoriler uygulayarak sürekli anlamaya çalışıyoruz - bir suçlu olması gerektiği gibi, fakir kullanıcıyı umursamayan kötü bir tembel kişi olmalı, ucuz bir hesaplamaya giden açgözlü bir iş adamı olmalı. Bunların hepsi konu dışında tamamen

Kontrolün kaybedilme olasılığı, işleri planlı ve düzenli bir şekilde yaptığımız gerçeğinden kaynaklanmaktadır .


Katılmıyorum Bir şeyin yanlış olduğunu biliyor (işlemi yapamıyor). Bir şeyin yanlış olduğunu bilmek, neden yanıldığının bilgisini gösterir. Bu dize, bu sütun (veya bu tablodaki bir sütun) için büyüktür. Bu olabilir çok iş olmadan, söyle. Bu lanet olası bir kurumsal veritabanı motoru. O bilir . Ancak bu bilgiyi aktarmaz. Programcının, veri tabanının aynı şeyi yapabileceğini gösterdiği gerçeğinden sonra çalıştırılacak bir sorgu yazabileceği göz önüne alındığında. Bunlar gizli belgelenmemiş yüzler değil. Sadece bir berbat bir hata mesajı :)
Moo-Suyu

heh ... argümanını mantıklı bir düşünceye değil, mantığa dayandırmalısın. Bir bilgisayar ne zamandan beri bir şey biliyor ? Bu Hollywood sineması değil. Bir program katı, önceden ayarlanmış bir kurulumdur ve varsayımlarınız bozulduğunda kontrolünüzü kaybettiniz. Bunu kavramak gerçekten bu kadar zor mu? Bir bilgisayar programı anlamıyor ve bu yüzden yanlış gittiğini anlayamıyor. Neredeyse, bazı tutarlılık denetimi tetiklendiğinde, yürütme zaten binlerce ifade ile devam etti ve hiç kimse hangi verilerin zaten bozulduğunu bilmiyor. Tek yapabileceğiniz zararı sınırlamak
Ichthyo

2

Bir yazılım firması için destek mühendisi olarak çalışıyorum ve sık sık bizim için yeni olan hata mesajlarını görüyoruz. Bunları geliştirme ekibimize geri gönderdiğimde, başvurunun kaynağında mesajı aramak zorundalar.

Bana öyle geliyor ki, kullanıcılara sunulmasa bile, dev ekibinin bir hata mesajı endeksi doc ya da veritabanına bir not ekleyeceği, bizim için yeni bir tane eklediğinde doc ya da veritabanına bir not eklemesi bizim için çok güvenli olacak. Müşteri sorunlarının nedenini bulmak ve zamandan kazanmak için çok daha hızlı ...


1
üzgünüm, bu oldukça pratik değil. Bu endeks belgesini yönetmek, doğru tutmaktan kim sorumlu olacaktır. Herhangi bir yazılı belge, koddan ayrı olarak, modası geçmiş olacak ve yazıldığı anda yeni hatalar için kaynak almaya başlayacaktır.
Ichthyo

Aksine, eğer her hatanın kendine has bir numarası varsa, bir betiğin kaynak koddan çıkardığı türden bir şey ve her birinin açıklaması da ya (özel olarak biçimlendirilmiş) bir yorum biçiminde ya da dize. Böylece, dokümanlar her derlemede otomatik olarak oluşturulur. Çıkarılan mesaj, son kullanıcının görmesini istediğiniz her şeyden biraz daha ayrıntılı olabilirdi. Fena fikir değil!
Jeanne Pindar

Bunun için bir komut dosyasına ihtiyacınız yok - birçok çalışma zamanı sistemi satır numarasını veya bazı benzer bilgileri kaydedebilir. Maalesef bu, asıl sorunla ilgili bir işe yaramaz , çünkü bu şekilde bir istisnanın nerede tespit edildiğini biliyoruz, ancak neyin yanlış gittiğini bilmiyoruz . İkincisini bulmak, hata ayıklama olarak adlandırılır - pratikte bu, insanlar tarafından yapılan az çok sıkıcı ve iş yoğun bir iştir.
Ichthyo

@ Jeanean ile birlikteyim - koda dahil edilecek veya kodda merkezi bir dizine sahip olacak kadar basit ve hata koduyla birlikte yorumlayacağım. Bir keresinde, istisna tespit edildiğinde, kodda kovalanması gereken bir şey yerine çevre ile ilgili bir sorun olduğunu söylemek için yeterli olabilecek bir durum olduğunu öğrenin.
glenatron

2

Gördüğünüz problem aslında doğru kapsülleme ve bilgi gizlemenin yan etkilerinden biri.

Modern sistemler son derece karmaşıktır. Herhangi bir görevi kodlarken, ortalama geliştiricinin kafasında tüm sistemin zihinsel modelini kullanıcı arayüzünden ham ikiliye tutabilmesi için çok az şans vardır.

Dolayısıyla, bir geliştirici oturuyor ve kodlama yaparken, bir veritabanı dosyasını geri yükleyen parçayı kodlarken, zihinsel modeli tamamen bir veritabanı dosyasını geri yükleme eylemini çevreleyen bitlerle doludur. İhtiyacı var (ve tahmin ediyorum, bu kodu yazmadım) bir dosyayı okumak, özelliklerini kontrol etmek, sürümleri okumak, mevcut verileri yedeklemek, bir birleştirme / üzerine yazma stratejisini seçmek, vb. UI'yi dikkate alır, bunun bir istisna işleyicide yazdığı hata dizesindedir. Gibi bir şey:

catch (IOException error)
{
//File is in use
throw new GenericExceptionParsedByTheUIThread("File is in use.");
}

Bu örnekte, dosyayı kullanabilecek işlemler veya hatta DB'deki diğer konular hakkında sorduğunuz faydalı bilgiler tamamen program dışıdır. DB dosyaları ile ilgilenen yüzlerce sınıf olabilir; bu sınıflara, dosyaları kullanan diğer tüm işlemlerle ilgili bilgileri veya dosya sistemine erişme ve diğer işlemlere bakma işlevini (bu işlemlerin THIS makinesinde bile olduğu varsayılarak) aktarılması sızdıran bir soyutlama olarak bilinir ; verimlilikte doğrudan bir maliyet var.

Yani bu tür hatalar modern günlerde böyle devam edebilir. Açıkçası, hepsi sabit COULD; ancak birçok durumda, düşünülenden çok daha fazla ek yükü vardır (örneğin, bu durumda, uzak bir makinenin bazı kullanıcılar için bu veritabanı dosyasını kullanıp kullanmadığını görmek için bu işlevin ağ bağlantılarının numaralandırmasını geçmesi gerekebilir. nedeni) ve maliyeti önemsiz olmaktan uzak.


@GWLlosa, bu harika bir cevap ve düşünmedim bir cevap. Bu, (ve burada tam bir kod örneği veremiyorum), bu IOException öğesini aldığımda, atmadan önce GenericException, yapabileceğim 1) ProcessesAlt sistemden işlemlerin bir listesini isteyin . 2) Her işleme hangi veritabanını kullandıklarını sorun. 3) İşlemi, üzerine yazmaya çalıştığım veritabanına atanan veritabanı ile eşleştirin, 4) bir DatabaseInUse(dbName, processName, applicationNameistisna atar . :)
Moo-Juice

1
Kesinlikle mümkün; ancak DB'yi işlemle eşleştiren kod (özellikle ağ üzerinden) karmaşık / yavaş / hataya yatkın olabilir, bu da bazı ek zararlar verebilir ("sadece yerel ayarları geri yüklemeye çalışıyorum (* #% ^!!"). % file !!!! NEDEN AĞ PAYLARININ
ERİŞİLEBİLİR

1
@ Moo-Juice: Önerdiğiniz şey oldukça saf. Veri tabanı gibi çok iş parçacıklı bir ortamda, "tüm xyz" lerin bir listesini almak için sadece bazı küresel hizmetlere ulaşamazsınız. Başka bir iş parçacığındaki başka bir servisle konuşsanız bile, tüm sistemin kilitlenmesini daha kötü hale getirebilecek, diğer verileri bozabilecek veya en azından o zaman kullanmanız gereken ek hatalara neden olabilecek bir kilit gerekir. ....
Ichthyo

1
Bu örnek gerçekten çok öğreticidir: Genellikle böyle bir catch işleyicide, try bloğundaki hangi bölümün başarısız olduğunu bile kesin olarak söyleyemezsiniz (genellikle bir IOException'a neden olabilecek birden fazla bölüm vardır). Bunun yanında, o konumda dosyanın adını söyleyememeniz, hangi mantıksal tablonun bu dosyaya karşılık geldiğini söylemeniz olasıdır.
Ichthyo

@Itthyo, alınma ama hiç de saf olduğunu sanmıyorum. Veritabanı motorundan sistemi kilitlemesini istemiyorum, hangi sürecin hala veritabanına bir kolu olduğunu söyleyeyim. Tüm teşebbüsü durma noktasına getirmesini istemiyorum. Bana basit bir cevap vermesi gerekiyorsa, bu ilk önce veritabanı sunucusunun temel tasarım hatasını gösterir. Unutmayın, ilgili bilgileri mümkün olan en hızlı şekilde geri vermek için tasarlanmalı. Soruyu sormak için "kim?" gerçekten dediğiniz kadar saf olmamalı :)
Moo-Juice

2

En sevdiğim, (70'li yılların sonlarında) Univac Fortran IV derleyicisinin rakamsızları okurken sadık bir şekilde duyurulmasıydı.

Anlamsız verilerin yorumlanmasına çalışıldı


+1, kesinlikle harika! Fiji'de sadece pes etmeyi ve gidip tavuk yetiştirmeyi istemenizi sağlayan bir tür hata.
Moo-Juice

Gerçekten, bu hata mesajı% 100 doğrudur - daha fazla conetxt ile daha arkadaşça bir mesaj istiyorsanız, biraz tahminci ve sezgisel tarama yapmanız gerekir; Bu yolla yanıltıcı hata mesajlarını ekleyebilirsiniz ..
Ichthyo

0

Hata mesajlarının çoğunun aslında programcı (öz) odaklı yüceltilmiş hata ayıklama kodu / printf ifadeleri olduğuna inanıyorum.

Kullanıcıya yönelik hata mesajları yazmak, kullanıcının kim olduğunu bilmek ve ne bilmek isteyeceklerini tahmin etmek anlamına gelir. Kod yazmanın ortasında bir geliştirici, şu anda yazdıkları kodda hata ayıklamak için ya da bilinen veya baskın Kullanım Durumu / Durumları için kullanışlıdır.

Kod yazmadan kullanıcı arayüzünün (veya kullanıcı deneyiminin) bir metin bölümünü tasarlamaya geçmek bir bağlam anahtarıdır. Çok dilli uygulamalar gibi büyük uygulamalarda, geliştirici tarafından tamamen ele alınmak yerine farklı bir kişiye veya takıma (UI, çeviri) teslim edileceği anlamına gelir; Kolayca kaybolur.

Elbette, hata işlemenin kontrol edilmesi ve doğrulanması, hatalar ve istisnalar ele alındığı sürece (yani yakalandı), düşük bir öncelik olarak kabul edilir. Hata durumlarının sıklıkla kendileriyle ilişkili olumsuz çağrışımları (yani hata veya başarısızlık) olduğu için, geliştiricilerin veya KG'nin kodlama tabanının zihinsel olarak önemsiz bir yeridir.


0

Sebebi, hata raporlamanın / işlemenin her zaman bir düşünce olarak yapılmasıdır . Tamamen düşünülmemiş olsalar bile, genel tasarımda çoğunlukla ikinci sınıf vatandaş olurlar.

Modern yazılımlar genellikle çoklu katmanlardan oluşur. Hata raporlama mantığınız çok fazla düşünmeden aceleye getirildiğinde, yararlı hata mesajları sunmak için gereken tüm bilgileri toplamak zordur .

Örneğin, hata arka uçta tutulur, ancak kapsamlı bir hata mesajı oluşturmak için daha yüksek katmanlardan bazı bilgilere ihtiyacı vardır. Çoğu iyi hata mesajı, hemen hemen tüm katmanlardan bilgiye ihtiyaç duyar (sistemde ne olduğuna dair kapsamlı bir görünüm vermek için). İdeal hata mesajı "Tamam, önce bir string aldık, daha sonra komik bir şeyler veren ayrıştırıcıdan geçti, oraya bakmak isteyebilirsiniz. Her neyse, olay daha da aşağıya çekildi ..." gibi görünüyordu.

Eğer hata raporlama mekanizması tasarım aşamasında birinci sınıf vatandaş değilse, bunu yapmak genellikle gereksiz eşleşmeyi gerektirir. Sanırım çoğu insan etkileyici görünmeyen bir şey için yapacak çok fazla iş buluyor ("Bakmak mı? Programım düştü ve hata mesajı yararlı!" Demeyi sever).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.