2009-08-10 17 views
8

eşdeğeri Java'da, belirli bir hattın ulaşılamayacağını belirtmek için bazen bir AssertionError ürününü atacağım. Bunun bir örneği, switch ifadesindeki default durumuna ulaşılamayacağını söylemek (bir örnek için bkz. this JavaSpecialists page)..Net'in Java's AssertionError

Benzer bir mekanizma kullanmak istiyorum. Net. Kullanabileceğim bir istisna var mı? Ya da aynı etkiyle kullanılabilecek başka bir yöntem var mı?

Düzenleme - kodunda bazı değişmezin (muhtemelen feci) arızası olmuştur belirtmek için, serbest kodda, ben zamanında bayrak başarısızlıkları için bir mekanizma arıyorum, netleştirmek için. Bağlantılı örnek, 0 ile 2 (dahil) arasında rastgele bir tamsayı oluşturur ve üretilen sayının her zaman 0, 1 veya 2 olduğunu iddia eder. Bu onaylama beklemezse, bazı bilinmeyene devam etmek yerine yürütmeyi tamamen durdurmak daha iyi olur. sistemin bozuk durumu.

cevap

8

Normalde, değer nereden geldiğini bağlı olarak InvalidOperationException veya ArgumentOutOfRangeException kullanırdım.

Alternatif Debug.Assert (tanımladığınız DEBUG önişlemci sembolü varken sadece başarısız olacaktır) veya .NET 4.0 Eğer Contract.Fail, Contract.Assert veya Contract.Assume duruma göre kullanabilirsiniz var. Açıkça bir istisna atmak, derleyicinin bir sonraki ifadenin ulaşılamayacağını bilmesinin yararına sahiptir.

Debug.Assert kodunun büyük bir hayranıyım - genellikle bir sürüm için uygun değildir (sadece başarısızlık yerine bir onay kutusu açar gibi) ve varsayılan olarak sürümde zaten tetiklenmez. Her zaman atılan istisnaları tercih ederim, çünkü kodunuzun "yanlıştır" ı tespit etme fırsatından sonra devam etmesini engelliyorlar.

Kod Sözleşmeleri, oyun sırasında nelerin korunacağına ilişkin her türlü seçenek olduğu için oyunu biraz değiştirir ve statik denetçi bu duruma giremeyeceğinizi kanıtlamaya yardımcı olabilir. Hala

1

Sen (Visual Studio projeler üzerinde varsayılan olarak tanımlanır tanımlanan TRACE derleme sembolü, varsa) oluşturur sürümü üzerinde çalışacak Trace.Assert yöntemi kullanabilirsiniz ... gerçi yürütme zamanı politikasını seçmek gerekir . Ayrıca, uygulamanızın onaylama hatalarına tepki verme şeklini de TraceListener aracılığıyla özelleştirebilirsiniz. Varsayılan, (interaktif olarak) DefaultTraceListener olup, uygulama etkileşimli modda çalışıyorsa bir iletişim kutusunda onaylamayı gösterecektir. Örneğin, bir istisna atmak isterseniz, kendi TraceListener'nu oluşturabilir ve Fail yöntemine atabilirsiniz. Daha sonra DefaultTraceListener'u kaldırabilir ve programmatically ya da configuration file numaralı telefondan kendinizinkini kullanabilirsiniz.

Bu, çok fazla sorun gibi görünüyor ve uygulamanızın izleyicileri izleme dinleyicileri aracılığıyla işleme biçimini dinamik olarak değiştirmek istiyorsanız yalnızca haklı bir gerekçedir. Her zaman başarısız olmak istediğiniz ihlaller için, kendi AssertionException sınıfınızı oluşturun ve hemen atın.

.NET 4.0 için Contract.Assert yöntemine kesinlikle bakarım. Ancak, bu yöntem sadece DEBUG veya CONTRACTS_FULL sembolleri tanımlandığında derlenmiştir. DEBUG yayın sürümleri üzerinde çalışmayacaktır ve CONTRACTS_FULL ayrıca bazı sürümleri denetlemeyi de açacaktır, bu sürümlerin bazıları sürüm oluşturmada mevcut olmak istemeyebilirsiniz.

İlgili konular