首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 運行時錯誤代碼完整手冊:從 I/O 錯誤到系統異常的詳細對照表

     編輯:Delphi

Delphi 運行時錯誤格式

Delphi 程式運行時發生未處理異常時,會顯示如下格式的錯誤訊息:

Run-time error nnn at xxxxxxxx
  • nnn:運行時錯誤編號
  • xxxxxxxx:錯誤發生的代碼地址

錯誤分類總覽

I/O 錯誤代碼表 (100-149)

類別編號範圍說明
I/O 錯誤100-149檔案、裝置、磁碟操作相關
致命錯誤200-255程式邏輯、記憶體、CPU 異常
作業系統錯誤1-99, 1000+Windows API 返回的系統錯誤碼
代碼常數名稱說明常見觸發場景
100DiskReadError磁碟讀取錯誤讀取超過檔案末尾、磁碟壞軌
101DiskWriteError磁碟寫入錯誤磁碟滿、寫保護、權限不足
102FileNotAssigned檔案未指派未呼叫 AssignFile 即使用 Reset/Rewrite/Append
103FileNotOpen檔案未開啟對關閉的檔案呼叫 Read/Write/Seek/EOF 等
104FileNotOpenInput輸入檔案未開啟Read/Readln/EOF 對未開啟的文字檔
105FileNotOpenOutput輸出檔案未開啟Write/Writeln 對未開啟的文字檔
106InvalidNumericFormat無效數值格式從文字檔讀取非數值內容到數值變數
150DriveNotReady磁碟機未就緒軟碟機無磁片、光碟機無光碟
151DriveNotFound找不到磁碟機無效磁碟機代號 (如 'Z:')
152TooManyOpenFiles開啟檔案過多超過作業系統檔案控制代碼限制
153InvalidFileName無效檔名檔名含非法字元、路徑過長
154DiskFull磁碟已滿寫入時剩餘空間不足

致命錯誤代碼表 (200-255) - 核心重點

代碼常數名稱說明原因分析與對策
200DivisionByZero除零錯誤整數/浮點數除以 0。檢查除數是否為 0
201RangeCheckError範圍檢查錯誤陣列越界、字串索引越界、賦值超出型別範圍。啟用 {$R+} 檢查
202StackOverflowError堆疊溢位遞迴過深、區域變數過大、無限遞迴。增加堆疊或改用迴圈
203HeapOverflowError堆積溢位記憶體不足、記憶體碎片化、大量物件未釋放
204InvalidPointer無效指標操作Free 零指標、雙重釋放、使用已釋放指標、指標運算錯誤
205FloatOverflow浮點數上溢計算結果超出浮點數最大值 (如 1E300 * 1E300)
206FloatUnderflow浮點數下溢計算結果接近 0 超出精度範圍
207InvalidFloatOp無效浮點運算Sqrt(-1)、Log(0)、0/0、未初始化浮點變數
215ArithmeticOverflow算術溢位整數運算超出型別範圍 (如 30000 * 30000 超過 SmallInt)
216AccessViolation存取違規 (AV)讀/寫無效記憶體位址。最常見錯誤!見下文詳細分析
217ControlBreak控制中斷用戶按 Ctrl+Break 或 Ctrl+C 終止主控台程式
218PrivilegedInstruction特權指令嘗試執行 CPU 特權指令 (通常為編譯器/系統錯誤)
219InvalidTypecast無效類型轉換as 轉換失敗、絕對地址轉換錯誤、介面查詢失敗
220InvalidVariantTypecast無效 Variant 轉換Variant 型別不相容轉換 (如字串轉 TDateTime 失敗)
221InvalidVariantOp無效 Variant 運算Variant 不支援的運算子 (如字串相乘)
222NoVariantDispatcher無 Variant 分派器自定 Variant 類型缺少分派邏輯
223CannotCreateVariantArray無法建立 Variant 陣列VarArrayCreate 參數錯誤或記憶體不足
224VariantNotArrayVariant 不含陣列對非陣列 Variant 使用陣列操作
225VariantArrayBoundsVariant 陣列邊界錯誤Variant 陣列索引越界

深度解析:Error 216 Access Violation (最常見致命錯誤)

錯誤訊息形式

Access violation at address 00401234 in module 'Project1.exe'. 
Read of address 00000000
或
Access violation at address 00401234 in module 'Project1.exe'. 
Write of address 00000004

四大核心原因

  1. 空指標解引用:P^ 或 Obj.Method 其中 P/Obj = nil
    var SL: TStringList;
    begin
      SL.Add('test');  // AV! SL 為 nil
    end;
  2. 已釋放物件的殘留引用:
    var SL: TStringList;
    begin
      SL := TStringList.Create;
      SL.Free;
      SL.Add('test');  // AV! 記憶體已釋放
    end;
  3. 陣列/字串越界 (開啟 {$R+} 時拋 201,關閉時可能拋 216):
    var Arr: array[1..10] of Integer;
    begin
      Arr[11] := 0;  // 可能 AV
    end;
  4. DLL/BPL 邊界傳遞物件:跨模組共享類實例導致虛函數表不匹配

除錯定位技巧

  1. 地址對應原始碼:使用 Find Error (Ctrl+F7) 或查看 .map 檔案
  2. 啟用 Debug DCU:Project Options → Linking → "Debug DCUs"
  3. 使用 FastMM4 完整模式:ReportMemoryLeaksOnShutdown := True; FullDebugMode
  4. 記錄呼叫堆疊:JclDebug + JclHookExcept 或 MadExcept/EurekaLog

Windows 系統錯誤代碼精選 (高頻遇到)

錯誤處理最佳實踐

1. 結構化異常處理 (try..except)

procedure SafeProcessFile(const FileName: string);
var
  F: TextFile;
  Line: string;
begin
  AssignFile(F, FileName);
  try
    Reset(F);
    try
      while not Eof(F) do
      begin
        Readln(F, Line);
        // 處理每行
      end;
    finally
      CloseFile(F);  // 確保關閉
    end;
  except
    on E: EInOutError do
      // I/O 錯誤 (代碼在 E.ErrorCode)
      LogError(Format('I/O Error %d: %s', [E.ErrorCode, E.Message]));
    on E: Exception do
      // 其他異常
      LogError(Format('Error: %s', [E.Message]));
  end;
end;

2. 全域異常捕獲 (應用程式級)

// 在 .dpr 專案原始碼中
Application.OnException := GlobalExceptionHandler;

procedure GlobalExceptionHandler(Sender: TObject; E: Exception);
begin
  // 記錄完整堆疊
  LogException(E);
  
  // 友善提示用戶
  if E is EAccessViolation then
    ShowMessage('程式發生內部錯誤 (存取違規),請重啟嘗試。')
  else if E is EInOutError then
    ShowMessage(Format('檔案操作失敗:%s', [E.Message]))
  else
    ShowMessage(Format('發生錯誤:%s', [E.Message]));
    
  // 決定是否終止
  // Application.Terminate;
end;

3. 取得詳細錯誤資訊的工具函數

function GetLastErrorMsg: string;
var
  ErrCode: DWORD;
  Buf: array[0..255] of Char;
begin
  ErrCode := GetLastError;
  if ErrCode = 0 then Exit('');
  if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ErrCode, 0, Buf, 255, nil) > 0 then
    Result := Format('OS Error %d: %s', [ErrCode, StrPas(Buf)])
  else
    Result := Format('OS Error %d (unknown)', [ErrCode]);
end;

// 使用範例
if not DeleteFile('test.txt') then
  ShowMessage('刪除失敗:' + GetLastErrorMsg);

快速查詢索引

常見 I/O 錯誤

  • 100: 讀取錯誤
  • 101: 寫入錯誤
  • 102: 檔案未指派
  • 103: 檔案未開啟
  • 104: 輸入檔未開啟
  • 105: 輸出檔未開啟
  • 106: 數值格式錯誤

常見致命錯誤

  • 200: 除零
  • 201: 範圍檢查
  • 202: 堆疊溢位
  • 203: 堆積溢位
  • 204: 無效指標
  • 205: 浮點上溢
  • 206: 浮點下溢
  • 207: 無效浮點運算
  • 215: 算術溢位
  • 216: 存取違規 ⭐
  • 217: Ctrl+Break
  • 219: 無效類型轉換
  • 220: 無效 Variant 轉換

常見系統錯誤

  • 2: 檔案不存在
  • 3: 路徑不存在
  • 5: 存取被拒絕
  • 6: 無效控制代碼
  • 32: 檔案共用違規
  • 87: 參數錯誤
  • 112: 磁碟已滿
  • 123: 無效名稱
  • 1450: 系統資源不足

總結

熟悉 Delphi 運行時錯誤代碼是快速定位 Bug 的關鍵技能。重點掌握:201 範圍檢查 (開啟 {$R+})、204 無效指標 (FastMM4 偵測)、216 存取違規 (最常見、最難查)、I/O 錯誤 100-106 (檔案操作基本功)。配合 GetLastError、SysErrorMessage、JclDebug/MadExcept 等工具,可將除錯效率提升數倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
代碼符號常數說明Delphi 獲取方式
2ERROR_FILE_NOT_FOUND系統找不到指定檔案GetLastError / SysErrorMessage
3ERROR_PATH_NOT_FOUND系統找不到指定路徑同上
5ERROR_ACCESS_DENIED存取被拒絕 (權限不足)寫入受保護目錄、註冊表
6ERROR_INVALID_HANDLE無效控制代碼關閉後再用 Handle
8ERROR_NOT_ENOUGH_MEMORY記憶體不足大量分配失敗
32ERROR_SHARING_VIOLATION檔案被佔用無法存取獨佔開啟檔案時再次開啟
87ERROR_INVALID_PARAMETER參數錯誤API 傳參錯誤
112ERROR_DISK_FULL磁碟已滿寫入失敗
123ERROR_INVALID_NAME檔名/路徑語法錯誤路徑含非法字元
1450ERROR_NO_SYSTEM_RESOURCES系統資源不足GDI/USER 物件耗盡
1460ERROR_TIMEOUT逾時WaitForSingleObject 等