İkisini de kullanmalısın. İddialar, bir geliştirici olarak size kolaylık sağlamak içindir. İstisnalar, çalışma süresi boyunca kaçırdığınız veya beklemediğiniz şeyleri yakalar.
Ben düşkün büyüdüğümüz glib hatası raporlama fonksiyonları yerine eski düz iddia ait. Assert ifadeleri gibi davranırlar, ancak programı durdurmak yerine bir değer döndürürler ve programın devam etmesine izin verirler. Şaşırtıcı derecede iyi çalışıyor ve bir bonus olarak, bir işlev "olması gerekeni" döndürmediğinde programınızın geri kalanına ne olacağını görüyorsunuz. Kilitlenirse, hata kontrolünüzün yolun başka bir yerinde gevşek olduğunu bilirsiniz.
Son projemde, ön koşul denetimini uygulamak için bu tarz işlevler kullandım ve bunlardan biri başarısız olursa, günlük dosyasına bir yığın izi yazdırır, ancak çalışmaya devam ederdim. Diğer insanlar benim hata ayıklama yapımı çalıştırırken bir sorunla karşılaştıklarında bana tonlarca hata ayıklama zamanı kazandırdı.
#ifdef DEBUG
#define RETURN_IF_FAIL(expr) do { \
if (!(expr)) \
{ \
fprintf(stderr, \
"file %s: line %d (%s): precondition `%s' failed.", \
__FILE__, \
__LINE__, \
__PRETTY_FUNCTION__, \
#expr); \
::print_stack_trace(2); \
return; \
}; } while(0)
#define RETURN_VAL_IF_FAIL(expr, val) do { \
if (!(expr)) \
{ \
fprintf(stderr, \
"file %s: line %d (%s): precondition `%s' failed.", \
__FILE__, \
__LINE__, \
__PRETTY_FUNCTION__, \
#expr); \
::print_stack_trace(2); \
return val; \
}; } while(0)
#else
#define RETURN_IF_FAIL(expr)
#define RETURN_VAL_IF_FAIL(expr, val)
#endif
Bağımsız değişkenlerin çalışma zamanı kontrolüne ihtiyacım olsaydı, şunu yapardım:
char *doSomething(char *ptr)
{
RETURN_VAL_IF_FAIL(ptr != NULL, NULL); // same as assert(ptr != NULL), but returns NULL if it fails.
// Goes away when debug off.
if( ptr != NULL )
{
...
}
return ptr;
}