Это код из пользовательской Microsoft .NET
реализации времени выполнения, и у меня есть следующие вопросы:
public static string ToBase64String(byte[] inArray, int offset, int length)
{
if (inArray == null) throw new ArgumentNullException("inArray");
if (offset < 0) throw new ArgumentOutOfRangeException("offset");
if (length < 0) throw new ArgumentOutOfRangeException("length");
if (offset + length > inArray.Length)
throw new ArgumentException("offset + length > inArray.Length");
// Fast return for the zero length case, note that this scenario is
// absolutely valid.
if (length == 0) return "";
// ....
}
Не должны ли операторы, которые проверяют предварительные условия (код контракта) для этого метода, фактически быть assert-like? Я имею в виду, откуда взялась идеология бросания исключений для кода нарушения контракта происходят от?
Я мог легко понять следующий код:
Contract.Requires(inArray != null);
Contract.Requires(offset >= 0);
// ...
Но выдает разные исключения ... Почему?
Невозможно правильно обработать такого рода исключения, потому что это просто указывает на логический недостаток, эта ошибка похожа на unchecked exception
в Java
, когда вы также даже не должны пытаться обработать это.
Теперь - я прав? Может быть, я не понимаю некоторые основополагающие принципы или склонен переусердствовать во всем?