Примечание: я очень рад сообщить вам, что фильтры исключений теперь на языке C # 6.0.
Это мысленный эксперимент, меня интересует ваше мнение:это имеет смысл для вас?Знаете ли вы, что подобное было уже предложено для языка программирования C #?Я бы даже не знал, куда отправить такое предложение ...
Идея состоит в том, чтобы вводить элементы синтаксиса для перехвата исключения, только если оно удовлетворяет определенному условию.
Один пример использования - при работе с COM Interop: все всегда выдает COMException
.Фактический отличительный код ошибки содержится в его сообщении.
Так что насчет (предложение 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
}
, что означает:
try
{
...
}
catch (COMException ex)
{
if (ex.Message.Contains("0x800706BA"))
{
// RPC server unavailable
}
else if (ex.Message.Contains("0x80010001"))
{
// Call rejected by callee
}
else
{
throw;
}
}
Подобные случаи: SoapException
, XmlException
...
Другой сценарий заключается в том, что исключения заключаются в качестве внутренних исключений в общем исключении, а логика перехвата должна зависеть от внутреннего исключения.
Скажем, у нас есть API, который охватывает исключения вроде этого: catch (NumberFormatException ex) { throw new BusinessException(ex) }
.
Как насчет (предложение 2А):
try
{
...
}
catch (inner NumberFormatException nfex)
{
...
}
, что означает:
catch (Exception ex where ex.InnerException is NumberFormatException)
{
NumberFormatException nfex = ex.InnerException;
...
}
или (2B):
catch (BusinessException bex inner NumberFormatException nfex)
{
...
}
, что означает:
catch (BusinessException bex where bex.InnerException is NumberFormatException)
{
NumberFormatException nfex = bex.InnerException;
...
}
В в этом случае(родом из Java) может выглядеть (2C):
catch (RemoteAccessException raex inner inner MyException mex)
{
...
}