Lưu ý: Tôi rất vui khi thông báo cho bạn rằng các bộ lọc ngoại lệ hiện có bằng ngôn ngữ C# 6.0.Bắt ngoại lệ với điều kiện
Đây là một thử nghiệm suy nghĩ, tôi quan tâm đến ý kiến của bạn: Điều đó có hợp lý với bạn không? Bạn có biết liệu một cái gì đó tương tự đã được đề xuất cho ngôn ngữ lập trình C#? Tôi thậm chí sẽ không biết gửi đề xuất như vậy ở đâu ...
Ý tưởng là giới thiệu các yếu tố cú pháp để chỉ bắt ngoại lệ nếu nó đáp ứng một điều kiện nhất định.
Ví dụ về trường hợp sử dụng là khi làm việc với COM Interop: Mọi thứ luôn ném một số COMException
. Mã lỗi phân biệt thực sự được chứa trong thông điệp của nó.
Vì vậy, những gì về (đề nghị 1):
try
{
...
}
catch (COMException ex where ex.Message.Contains("0x800706BA"))
{
// RPC server unavailable
}
catch (COMException ex where ex.Message.Contains("0x80010001"))
{
// Call rejected by callee
}
mà dịch để:
try
{
...
}
catch (COMException ex)
{
if (ex.Message.Contains("0x800706BA"))
{
// RPC server unavailable
}
else if (ex.Message.Contains("0x80010001"))
{
// Call rejected by callee
}
else
{
throw;
}
}
trường hợp tương tự là: SoapException
, XmlException
...
kịch bản khác là khi ngoại lệ được bao bọc như ngoại lệ bên trong trong một ngoại lệ chung, và logic bắt nên phụ thuộc vào ngoại lệ bên trong.
Giả sử chúng tôi có API bao gồm các ngoại lệ như sau: catch (NumberFormatException ex) { throw new BusinessException(ex) }
.
gì về (đề nghị 2A):
try
{
...
}
catch (inner NumberFormatException nfex)
{
...
}
mà dịch để:
catch (Exception ex where ex.InnerException is NumberFormatException)
{
NumberFormatException nfex = ex.InnerException;
...
}
hay (2B):
catch (BusinessException bex inner NumberFormatException nfex)
{
...
}
mà dịch để:
catch (BusinessException bex where bex.InnerException is NumberFormatException)
{
NumberFormatException nfex = bex.InnerException;
...
}
Trong this case (originally from Java) nó có thể trông giống như (2C):
catch (RemoteAccessException raex inner inner MyException mex)
{
...
}
Thanh cao cho các tính năng ngôn ngữ mới trong C#. Và tính năng này không thêm gì mà bạn không thể làm dễ dàng theo ý kiến của tôi. –
@ 0xA3: Không, nó chỉ là cú pháp. Nhưng nó bằng cách nào đó ngoại suy những ý tưởng đằng sau LINQ (ít nhất là đề xuất 1). – chiccodoro
Tôi nghĩ bạn có thể đăng nó lên Kết nối của Microsoft nơi bạn có thể yêu cầu tính năng này làm một tính năng. –