Seperti yang dinyatakan orang lain, tetapi berfokus pada pengecualian, ini benar-benar tentang penanganan pengalihan kendali yang ambigu.
Dalam benak Anda, Anda mungkin memikirkan skenario seperti ini:
public static object SafeMethod()
{
foreach(var item in list)
{
try
{
try
{
//do something that won't transfer control outside
}
catch
{
//catch everything to not throw exceptions
}
}
finally
{
if (someCondition)
//no exception will be thrown,
//so theoretically this could work
continue;
}
}
return someValue;
}
Secara teoritis, Anda dapat melacak aliran kontrol dan berkata, ya, ini "ok". Tidak ada pengecualian yang dilemparkan, tidak ada kontrol yang ditransfer. Tapi desainer bahasa C # memiliki masalah lain dalam pikirannya.
Pengecualian yang Dilempar
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
The Dreaded Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
Kembalinya
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
Break up
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Jadi kesimpulannya, ya, sementara ada adalah sebuah sedikit kemungkinan menggunakan continuedalam situasi di mana kontrol tidak ditransfer, tapi bagus (sebagian?) Dari kasus melibatkan pengecualian atau returnblok. Perancang bahasa merasa ini terlalu ambigu dan (kemungkinan) tidak mungkin untuk memastikan pada waktu kompilasi bahwa Anda hanyacontinue digunakan dalam kasus di mana aliran kontrol tidak ditransfer.