2010-05-18 5 views
5

Win32 C++ kod yazarken, Win32 API'lerinin hatalarını nasıl ele alacağımız konusunda bazı ipuçlarına değer veriyorum. ÖzellikleWin32 C++ kodunun hata işlenmesiyle ilgili öneriler: AtlThrow ve STL özel durumları

, bir Win32 işlev çağrısı bir arıza (örneğin MapViewOfFile) durumunda, daha iyi o:

  1. kullanım AtlThrowLastWin32

  2. std türetilmiş bir Win32Exception sınıfını tanımlamak :: istisna, HRESULT GetLastError tarafından döndürülen değere karşılık gelen bir HRESULT veri üyesi ile?

İkinci durumda, bir ayrıntılı hata dizesini döndürür ne() yöntemini kullanabilirsiniz (örneğin, "MapViewOfFile çağrı Sınıfım :: DoSomething() yöntemi. başarısız").

1 ve 2'nin artıları ve eksileri nelerdir?

Eksik olduğum başka herhangi bir seçenek var mı?

Bir not olarak, geliştirdiğim bileşeni yerelleştirmek istiyorsam, istisnayı yerelleştirmeyi nasıl yapabilirim() string? Unicode yerelleştirilmiş bir hata dizesine ne() tarafından döndürülen orijinal ingilizce dizgisini eşleyen bir tablo oluşturmayı düşünüyordum. Daha iyi bir yaklaşım önerilebilir mi?

Görüş ve önerileriniz için çok teşekkürler.

cevap

5

AtlThrow pek kullanışlı değil, yalnızca bir hata kodu saran CAtlException atar. Bir MapViewOfFile başarısız olması, size ya da kullanıcı gerçekten çok yanlış gittiğini hiç söyleme, düşük düzey hata kodu ile gerçekten olağanüstü bir sorundur. Hatayı ele almak neredeyse imkansızdır, muhtemelen onu silkebilir ve bir MMF kullanamazsınız. Hatayı günlüğe kaydetmeniz ve programınızı çok genel bir hatayla sonlandırmanız gerekir.

Hata iletinizde çok ayrıntılı bilgi almak genellikle harcanan çabadır. "MapViewOfFile çağrısı MyClass :: DoSomething() yönteminde başarısız oldu" sadece kullanıcı veya destek personeli için hiçbir şey ifade etmiyor. Ancak sizin için harika, hatayı izleyecek bir şey. Ancak, yerelleştirme sorunu olmadan, __FILE__ ve __LINE__ makrolarını kullanarak bunu kolayca otomatikleştirebilirsiniz. Tüm bu hataları gerçekten kaynak koduna uymanız gerekiyor.

Hata mesajını kısa ve çabuk tutun. Windows hataları için, Windows'un iletiyi oluşturmasına izin vermek için FormatMessage() öğesini kullanmak istersiniz. Otomatik olarak yerelleştirilecek, mesaj metni standart hale getirilecek ve iyi yönlendirilecektir. Std :: exception'dan türetme tamamdır. Özel mesajlar için dize kaynak kimliklerini kullanın, böylece bunları kolayca yerelleştirebilirsiniz. Ne() sorununu çözer.