Saya menemukan fitur baru ini di C # yang memungkinkan penangan tangkapan untuk mengeksekusi ketika kondisi tertentu terpenuhi.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Saya mencoba untuk memahami kapan ini mungkin berguna.
Satu skenario bisa jadi seperti ini:
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
tetapi sekali lagi ini adalah sesuatu yang dapat saya lakukan dalam penangan yang sama dan mendelegasikan ke metode yang berbeda tergantung pada jenis driver. Apakah ini membuat kode lebih mudah dipahami? Bisa dibilang tidak.
Skenario lain yang dapat saya pikirkan adalah seperti:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Sekali lagi ini adalah sesuatu yang dapat saya lakukan seperti:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
Apakah menggunakan fitur 'catch, when' membuat penanganan exception lebih cepat karena handler dilewati seperti itu dan stack unwinding bisa terjadi jauh lebih awal dibandingkan dengan menangani kasus penggunaan spesifik dalam handler? Adakah kasus penggunaan khusus yang lebih cocok dengan fitur ini yang kemudian dapat diadopsi sebagai praktik yang baik?
when
kebutuhan untuk mengakses pengecualian itu sendiri