Могу ли я установить {$RangeChecks on} для устройства, которое не имеет интерфейса?
У меня есть проект Delphi, который содержит много форм и модулей (без интерфейса), формы, где я помещаю " {$RangeChecks on} " ловит исключение вне диапазона, но когда я добавляю его в модуль, который содержит классы, он не поймать исключение, поможет ли выловить исключения из индекса в этом модуле?
1 ответ
Чтобы поймать исключение, вам нужно написать try
-except
блок:
try
// call code that fails range checks
except
on E: ERangeError do
// ...
end;
Чтобы код генерировал эти исключения, необходимо сделать две вещи:
Убедитесь, что проверка диапазона включена. Один из способов сделать это с помощью
$RANGECHECKS
(ака$R
) директива компилятора. Вы можете поместить его в любом месте блока, например, вверху или непосредственно перед строками кода, которые вы хотите проверить. Он применяется ко всему коду, который следует за ним в текущем модуле, пока компилятор не встретит другую директиву, которая отключает его, например{$R-}
,Если ваш план состоит в том, чтобы поместить его в верхнюю часть каждого модуля, то вы можете сделать то, что я сделал, и включить его глобально, отредактировав параметры компилятора проекта. (Пока вы там, я рекомендую включить проверку переполнения и "оператор typed @").
Выполнить код, который нарушает диапазон типа или массива. Присвойте большие целочисленные значения меньшим типам или отрицательные значения неподписанным типам. Чтение из-за конца динамического массива или массива фиксированного размера, длина которого известна во время компиляции.
Это не имеет ничего общего с назначением модуля или видом кода, который содержит модуль. Опция проверки диапазона применяется в равной степени к любому виду единиц, включая единицы, которые определяют формы, единицы, которые определяют модули данных, и единицы, которые вообще не определяют объекты времени разработки. Если вы считаете, что тип кода в ваших единицах влияет на поведение опции проверки диапазона, то у вас есть другие проблемы, требующие расследования