Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибки времени выполнения

Delphi , Синтаксис , Ошибки и Исключения

Ошибки времени выполнения

Виндоват - испраглюсь!


type
str31  = string[31];


function ErrMeaning (ResultCode: Integer): str31;
{----------------------------------------------------------}
{ Возвращает строковое значение по коду ошибки.            }
{----------------------------------------------------------}

const
NumOfEntries = 108;
type
ErrorEntry = record
Code: Integer;
Meaning: str31;
end;
ErrorMeaningsArray = array [1..NumOfEntries] of ErrorEntry;
const
MeaningsArray: ErrorMeaningsArray =
{Ошибки DOS}

((Code:   1;  Meaning: 'Неверный номер DOS-функции' {Invalid DOS function number}),
(Code:   2;  Meaning: 'Файл не найден' {File not found}),
(Code:   3;  Meaning: 'Путь не найден' {Path not found}),
(Code:   4;  Meaning: 'Слишком много открытых файлов' {Too many open files}),
(Code:   5;  Meaning: 'В доступе к файлу отказано' {File access denied}),
(Code:   6;  Meaning: 'Неверный дескриптор файла' {Invalid file handle}),
(Code:   7;  Meaning: 'Разрушены управляющие блоки памяти' {Memory control blocks destroyed}),
(Code:   8;  Meaning: 'Недостаточно памяти DOS' {Insufficient DOS memory}),
(Code:   9;  Meaning: 'Неверный адрес блока памяти' {Invalid memory block address}),
(Code:  10;  Meaning: 'Неверное окружение DOS' {Invalid DOS environment}),
(Code:  11;  Meaning: 'Неверный формат (DOS)' {Invalid format (DOS)}),
(Code:  12;  Meaning: 'Неверный код доступа к файлу' {Invalid file access code}),
(Code:  13;  Meaning: 'Неверные данные (DOS)' {Invalid data (DOS)}),
(Code:  15;  Meaning: 'Неверный номер устройства' {Invalid drive number}),
(Code:  16;  Meaning: 'Невозможно удалить текущую директорию' {Cannot remove current directory}),
(Code:  17;  Meaning: 'Невозможно переименовать драйвер' {Cannot rename across drives}),
(Code:  18;  Meaning: 'Файлов больше нет' {No more files}),
(Code:  19;  Meaning: 'Диск защищен от записи' {Disk write-protected}),
(Code:  20;  Meaning: 'Неизвестное устройство (DOS)' {Unknown unit (DOS)}),
(Code:  21;  Meaning: 'Устройство не готово' {Drive not ready}),
(Code:  22;  Meaning: 'Неизвестная команда DOS' {Unknown DOS command}),
(Code:  23;  Meaning: 'CRC-ошибка' {CRC error}),
(Code:  24;  Meaning: 'Плохой запрос длины структуры' {Bad request structure length}),
(Code:  25;  Meaning: 'Ошибка поиска' {Seek error}),
(Code:  26;  Meaning: 'Неизвестный тип носителя' {Unknown media type}),
(Code:  27;  Meaning: 'Сектор диска не найден' {Disk sector not found}),
(Code:  28;  Meaning: 'Недостаточно бумаги' {Out of paper}),
(Code:  29;  Meaning: 'Ошибка записи' {Write fault}),
(Code:  30;  Meaning: 'Ошибка чтения' {Read fault}),
(Code:  31;  Meaning: 'Общий сбой' {General failure}),
(Code:  32;  Meaning: 'Нарушение общего доступа к файлу' {File sharing violation}),
(Code:  33;  Meaning: 'Нарушение блокировки файла' {File lock violation}),
(Code:  34;  Meaning: 'Неверная смена диска' {Invalid disk change}),
(Code:  35;  Meaning: 'Управляющий блок файла недоступен' {File control block unavailable}),
(Code:  36;  Meaning: 'Переполнение разделяемого буфера' {Sharing buffer overflow}),
(Code:  37;  Meaning: 'Несовпадение кодовой страницы' {Code page mismatch}),
(Code:  38;  Meaning: 'Ошибка обработки EOF' {Error handling EOF}),
(Code:  39;  Meaning: 'Дескриптор диска полон' {Handle disk full}),
(Code:  50;  Meaning: 'Сетевой запрос не поддерживается' {Network request not supported}),
(Code:  51;  Meaning: 'Удаленный компьютер недоступен' {Remote computer not listening}),
(Code:  52;  Meaning: 'Дубликат имени в сети' {Duplicate name on network}),
(Code:  53;  Meaning: 'Сетевое имя не найдено' {Network name not found}),
(Code:  54;  Meaning: 'Сеть занята' {Network busy}),
(Code:  55;  Meaning: 'Сетевое устройство больше не существует' {Network device no longer exists}),
(Code:  56;  Meaning: 'Превышен лимит команды NetBIOS' {NetBIOS command limit exceeded}),
(Code:  57;  Meaning: 'Ошибка сетевого адаптера' {Network adaptor error}),
(Code:  58;  Meaning: 'Неверный сетевой ответ' {Incorrect network response}),
(Code:  59;  Meaning: 'Неожиданная ошибка сети' {Unexpected network error}),
(Code:  60;  Meaning: 'Несовместимый удаленный адаптер' {Incompatible remote adaptor}),
(Code:  61;  Meaning: 'Очередь на печать переполнена' {Print queue full}),
(Code:  62;  Meaning: 'Нет достаточного места для файла печати' {Not enough space for print file}),
(Code:  63;  Meaning: 'Файл печати удален' {Print file deleted}),
(Code:  64;  Meaning: 'Сетевое имя удалено' {Network name deleted}),
(Code:  65;  Meaning: 'Доступ запрещен' {Access denied}),
(Code:  66;  Meaning: 'Неверный тип сетевого устройства' {Network device type incorrect}),
(Code:  67;  Meaning: 'Сетевое имя не найдено' {Network name not found}),
(Code:  68;  Meaning: 'Превышен предел сетевого имени' {Network name limit exceeded}),
(Code:  69;  Meaning: 'Превышен предел сеансов NetBIOS' {NetBIOS session limit exceeded}),
(Code:  70;  Meaning: 'Временная пауза' {Temporarily paused}),
(Code:  71;  Meaning: 'Сетевой запрос не принят' {Network request not accepted}),
(Code:  72;  Meaning: 'Пауза переадресации печати/диска' {Print/disk redirection paused}),
(Code:  80;  Meaning: 'Файл уже существует' {File already exists}),
(Code:  82;  Meaning: 'Невозможно создать каталог' {Cannot make directory entry}),
(Code:  83;  Meaning: 'Ошибка прерывания 24' {Fail on interrupt 24}),
(Code:  84;  Meaning: 'Слишком много переадресаций' {Too many redirections}),
(Code:  85;  Meaning: 'Дубликат переадресации' {Duplicate redirection}),
(Code:  86;  Meaning: 'Неверный пароль' {Invalid password}),
(Code:  87;  Meaning: 'Неверный параметр' {Invalid parameter}),
(Code:  88;  Meaning: 'Ошибка данных сети' {Network data fault}),
{Ошибки ввода/вывода (I/O errors)}

(Code: 100;  Meaning: 'Ошибка чтения диска' {Disk read error}),
(Code: 101;  Meaning: 'Ошибка записи диска' {Disk write error}),
(Code: 102;  Meaning: 'Файл не назначен' {File not assigned}),
(Code: 103;  Meaning: 'Файл не открыт' {File not open}),
(Code: 104;  Meaning: 'Не открыт файл для приема' {File not open for input}),
(Code: 105;  Meaning: 'Не открыт файл для выдачи' {File not open for output}),
(Code: 106;  Meaning: 'Неверный числовой формат' {Invalid numeric format}),
{Критические ошибки (Только для реального или защищенного режима)}

(Code: 150;  Meaning: 'Диск защищен от записи' {Disk is write protected}),
(Code: 151;  Meaning: 'Неизвестное устройство' {Unknown unit}),
(Code: 152;  Meaning: 'Устройство не готово' {Drive not ready}),
(Code: 153;  Meaning: 'Неизвестная команда DOS' {Unknown DOS command}),
(Code: 154;  Meaning: 'Ошибка CRC в данных' {CRC error in data}),
(Code: 155;  Meaning: 'Плохой запрос длины структуры устройства' {Bad drive request struct length}),
(Code: 156;  Meaning: 'Ошибка позиционирования диска' {Disk seek error}),
(Code: 157;  Meaning: 'Неизвестный тип носителя' {Unknown media type}),
(Code: 158;  Meaning: 'Сектор не найден' {Sector not found}),
(Code: 159;  Meaning: 'Недостаточно бумаги в принтере' {Printer out of paper}),
(Code: 160;  Meaning: 'Ошибка записи устройства' {Device write fault}),
(Code: 161;  Meaning: 'Ошибка чтения устройства' {Device read fault}),
(Code: 162;  Meaning: 'Аппаратный сбой' {Hardware failure}),
{Фатальные ошибки}

(Code: 200;  Meaning: 'Деление на ноль' {Division by zero}),
(Code: 201;  Meaning: 'Ошибка проверки диапазона' {Range check error}),
(Code: 202;  Meaning: 'Ошибка переполнения стека' {Stack overflow error}),
(Code: 203;  Meaning: 'Ошибка переполнения кучи' {Heap overflow error}),
(Code: 204;  Meaning: 'Неверная операция с указателем' {Invalid pointer operation}),
(Code: 205;  Meaning: 'Переполнение числа с плавающей точкой' {Floating point overflow}),
(Code: 206;  Meaning: 'Потеря значимости числа с плавающей точкой' {Floating point underflow}),
(Code: 207;  Meaning: 'Неверная операция с числом с плавающей точкой' {Invalid floating pt. operation}),
(Code: 208;  Meaning: 'Не установлен оверлей-менеджер' {Overlay manager not installed}),
(Code: 209;  Meaning: 'Ошибка чтения оверлей-файла' {Overlay file read error}),
(Code: 210;  Meaning: 'Объект не инициализирован' {Object not initialised}),
(Code: 211;  Meaning: 'Вызов абстрактного метода' {Call to abstract method}),
(Code: 212;  Meaning: 'Ошибка регистрации потока' {Stream registration error}),
(Code: 213;  Meaning: 'Индекс TCollection вышел за границы диапазона' {TCollection index out of range}),
(Code: 214;  Meaning: 'Ошибка переполнения TCollection' {TCollection overflow error}),
(Code: 215;  Meaning: 'Ошибка арифметического переполнения' {Arithmetic overflow error}),
(Code: 216;  Meaning: 'Общая ошибка защиты' {General Protection Fault}),
(Code: 217;  Meaning: 'Необработанное исключение' {Unhandled exception}),
(Code: 219;  Meaning: 'Неверное приведение типа' {Invalid typecast}));
var
Low, High, Mid, Diff: Integer;
begin
Low := 1;
High := NumOfEntries;
while Low <= High do
begin
Mid := (Low + High) div 2;
Diff := MeaningsArray[Mid].Code - ResultCode;
if Diff < 0 then Low  := Mid + 1 else
if Diff > 0 then High := Mid - 1 else
begin {нашли это}
ErrMeaning := MeaningsArray[Mid].Meaning;
Exit; {ErrMeaning}
end;
end; {while}
ErrMeaning := 'Ошибка ' + IntToStr(ResultCode) +
' (неизвестное значение)';
end; {ErrMeaning}

ещё...


  var
    i: Integer;
  begin
    for i := 1 to NumOfEntries do
      if MeaningsArray[i].Code < ResultCode then
        Continue {до следующей итерации цикла FOR loop}
      else
      begin
        if MeaningsArray[i].Code = ResultCode then
        begin
          ErrMeaning := MeaningsArray[i].Meaning;
          Exit; {ErrMeaning}
        end
        else {Code in array > ResultCode}
          Break; {выход из цикла FOR}
      end;
    ErrMeaning := 'Ошибка ' + IntToStr(ResultCode) +
                  ' (неизвестное значение)';
  end; {ErrMeaning}

Перевод контента на русский язык:

Код, который вы предоставили, это функция на Паскале, которая принимает целое число в качестве входного параметра и возвращает строку, указывающую смысл ошибочного кода. Ошибочные коды определены в массиве записей, где каждая запись содержит ошибочный код и соответствующее сообщение.

Вот разбивка кода:

  1. Функция ErrMeaning принимает целое число ResultCode в качестве входного параметра.
  2. Она инициализирует две переменные Low и High в 1 и количество элементов в массиве, соответственно.
  3. Она вступает в цикл while, который продолжается до тех пор, пока Low не будет больше High.
  4. Внутри цикла она рассчитывает среднюю точку Mid между Low и High, а затем рассчитывает разницу Diff между ошибочным кодом на середине Mid и входным параметром ResultCode.
  5. Если Diff отрицательна, то означает, что ошибочный код на середине меньше входного параметра ResultCode, поэтому она обновляет Low до Mid + 1. Если Diff положительна, то означает, что ошибочный код на середине больше входного параметра ResultCode, поэтому она обновляет High до Mid - 1.
  6. Если Diff равна нулю, то означает, что ошибочный код на середине совпадает с входным параметром ResultCode, поэтому она устанавливает ErrMeaning в соответствующее сообщение и выходит из функции.
  7. Если цикл завершается без обнаружения совпадающего ошибочного кода, то она устанавливает ErrMeaning в defaultMessage, указывающий, что ошибочный код неизвестен.

Есть некоторые улучшения, которые можно сделать в этом коде:

  1. Цикл can быть заменен алгоритмом двоичного поиска, который сделает функцию более эффективной для больших массивов.
  2. Вместо использования цикла while и обновления Low и High, вы можете использовать переменную цикла и повторять до тех пор, пока она не достигнет желаемой середины.
  3. Вы также можете рассмотреть добавление обработки ошибок для случаев, когда входной параметр ResultCode находится вне диапазона валидных ошибочных кодов.

Вот пример реализации алгоритма двоичного поиска:

function ErrMeaning( ResultCode: Integer ): string;
var
  Low, High, Mid: Integer;
begin
  Low  := 1;
  High := NumOfEntries;

  while Low <= High do
  begin
    Mid := (Low + High) div 2;
    if MeaningsArray[Mid].Code = ResultCode then
    begin
      ErrMeaning := MeaningsArray[Mid].Meaning;
      Exit;
    end else if MeaningsArray[Mid].Code < ResultCode then
      Low := Mid + 1
    else
      High := Mid - 1;
  end;

  ErrMeaning := 'Error ' + IntToStr(ResultCode) + ' (unknown value)';
end;

В этом коде используется схожий подход с оригиналом, но он рассчитывает середину и обновляет Low или High в зависимости от того, является ли ошибочный код на середине меньше, равен или больше входного параметра ResultCode. Это делает функцию более эффективной для больших массивов.

Ошибки времени выполнения в программе.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 20:02:37/0.0048871040344238/0