Tôi đã tìm thấy tính năng mới này trong C # cho phép một trình xử lý bắt thực thi khi một điều kiện cụ thể được đáp ứng.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Tôi đang cố gắng hiểu khi nào điều này có thể hữu ích.
Một kịch bản có thể là như thế này:
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
}
..
nhưng đây lại là điều mà tôi có thể làm trong cùng một trình xử lý và ủy quyền cho các phương thức khác nhau tùy thuộc vào loại trình điều khiển. Điều này có làm cho mã dễ hiểu hơn không? Có thể cho rằng không.
Một kịch bản khác mà tôi có thể nghĩ ra là:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Một lần nữa, đây là điều mà tôi có thể làm như:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
Việc sử dụng tính năng 'catch, when' có làm cho việc xử lý ngoại lệ nhanh hơn vì trình xử lý bị bỏ qua như vậy và việc mở ngăn xếp có thể xảy ra sớm hơn nhiều so với việc xử lý các trường hợp sử dụng cụ thể trong trình xử lý không? Có bất kỳ trường hợp sử dụng cụ thể nào phù hợp hơn với tính năng này mà mọi người có thể áp dụng như một phương pháp hay không?
try..catch...catch..catch..finally
?
catch (Exception ex)
, kiểm tra loại và throw
nếu không. Mã có tổ chức hơn một chút (hay còn gọi là tránh nhiễu mã) chính là lý do tại sao tính năng này tồn tại. (Đây là thực sự đúng đối với rất nhiều tính năng.)
when
nhu cầu để truy cập ngoại lệ bản thân