Sanırım @ JackAidley , bunun özünü zaten söyledi , ama şunu şöyle formüle edeyim:
İstisnasız (örneğin, C)
Düzenli kod akışında şunlara sahip olursunuz:
if (condition) {
statement;
} else if (less_likely_condition) {
less_likely_statement;
} else {
least_likely_statement;
}
more_statements;
“Erken çıkış hatası” durumunda, kodunuz aniden şunu okur:
/* demonstration example, do NOT code like this */
if (condition) {
statement;
} else {
error_handling;
return;
}
Bu kalıbı - a (ya da hatta ) bloğun return
içinde görürseniz , söz konusu kodun bir bloğu olmaması için derhal yeniden işleyin :else
if
else
/* only code like this at University, to please structured programming professors */
function foo {
if (condition) {
lots_of_statements;
}
return;
}
Gerçek dünyada…
/* code like this instead */
if (!condition) {
error_handling;
return;
}
lots_of_statements;
Bu iç içe çok fazla önler ve “erken patlak” Dava (zihin tutmaya yardımcı olur - ve kod akışını - temiz) yerine getirir ve “içine daha muhtemel şey koymak ihlal etmediğini if
sadece hayır olduğundan parçası” else
bölümü .
C
ve temizleme
Benzer bir soruya (bu yanlış olana) cevaptan esinlenerek, C ile nasıl temizlik yaptığınızı işte burada bir veya iki çıkış noktasını kullanabilirsiniz, işte iki çıkış noktası için bir tane:
struct foo *
alloc_and_init(size_t arg1, int arg2)
{
struct foo *res;
if (!(res = calloc(sizeof(struct foo), 1)))
return (NULL);
if (foo_init1(res, arg1))
goto err;
res.arg1_inited = true;
if (foo_init2(&(res->blah), arg2))
goto err;
foo_init_complete(res);
return (res);
err:
/* safe because we use calloc and false == 0 */
if (res.arg1_inited)
foo_dispose1(res);
free(res);
return (NULL);
}
Yapılacak daha az temizleme işlemi varsa, bunları bir çıkış noktasına daraltabilirsiniz:
char *
NULL_safe_strdup(const char *arg)
{
char *res = NULL;
if (arg == NULL)
goto out;
/* imagine more lines here */
res = strdup(arg);
out:
return (res);
}
goto
Bununla başa çıkabiliyorsanız, bu kullanım tamamen iyidir; kullanımdan uzak durma tavsiyesi, goto
kullanımın iyi, kabul edilebilir, kötü, makarna kodu veya başka bir şey olup olmadığına henüz karar veremeyen insanlara yöneliktir.
İstisnalar
Yukarıdakiler, kendimi çok tercih ettiğim istisnalar dışındaki dillerden bahsediyor (açık hata işlemlerini daha iyi ve daha az sürprizle yapabilirim). İgli'den alıntı yapmak için:
<igli> exceptions: a truly awful implementation of quite a nice idea.
<igli> just about the worst way you could do something like that, afaic.
<igli> it's like anti-design.
<mirabilos> that too… may I quote you on that?
<igli> sure, tho i doubt anyone will listen ;)
Ancak burada, istisnalar dışında bir dilde nasıl iyi yaptığınıza ve bunları iyi kullanmak istediğinizde:
istisnalar karşısında hata iadesi
return
Bir istisna atmakla erken saatlerin çoğunu değiştirebilirsiniz . Ancak , sizin , normal herhangi bir kod akışının yani program akış, hangi program, iyi, bir istisna ... bir hata durumu karşılaşabilir veya bloklarýnýn etmedi etmeyecektir herhangi istisnalar yükseltmek.
Bu şu demek…
# this page is only available to logged-in users
if not isLoggedIn():
# this is Python 2.5 style; insert your favourite raise/throw here
raise "eh?"
… Tamam, ama…
/* do not code like this! */
try {
openFile(xyz, "rw");
} catch (LockedException e) {
return "file is locked";
}
closeFile(xyz);
return "file is not locked";
… değil. Temel olarak bir istisna, bir kontrol akışı elemanı değildir . Bu aynı zamanda Operasyonların size garip görünmesini sağlar (“bu Java ™ programcıları bize her zaman bu istisnaların normal olduğunu söyler”) ve hata ayıklamayı engelleyebilir (örneğin, IDE'ye herhangi bir istisnayı kırmasını söyleyin). İstisnalar, genellikle çalışma zamanı ortamının yığın geri izleme, vs. üretmek için çözülmesini gerektirir. Buna karşı muhtemelen daha fazla sebep vardır.
Bu, aşağıdakilere dayanır: istisnaları destekleyen bir dilde, mevcut mantık ve stille eşleşen ve doğal hisseden her şeyi kullanın. Sıfırdan bir şeyler yazıyorsanız, erken kararlaştırın. Sıfırdan bir kütüphane yazıyorsanız, tüketicilerinizi düşünün. ( abort()
Kütüphanede de kullanmayın …) Ama ne yaparsanız yapın, kural olarak, işlem normal olarak devam ederse (az ya da çok) devam ederse, bir istisna oluşturmayın.
genel tavsiye İstisnalar
Önce tüm geliştirme ekibi tarafından kararlaştırılan İstisnalar'ın program içi kullanımını kullanmaya çalışın. Temel olarak, onları planlayın. Onları bolca kullanmayın. Bazen, C ++, Java ™, Python'da bile hata geri dönüşü daha iyidir. Bazen değil; onları düşünce ile kullanın.