📄 error.cpp
字号:
////////////////////////////////////////////
// //
// Error.cpp //
// 错误处理模块 //
// 接受系统错误报告并屏幕反馈给用户 //
// 最后更新时间:2004年4月23日11:33 //
// //
////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include "Window.h"
#include "Error.h"
extern Window winEdit;
void ShowError
(
const ErrorType ErrorCode, // 错误类型代码
const int LineNo, // 发生错误的行号
const char Extra[MaxY] // 附加信息,变量、标识符等
)
{
char strTemp[MaxY];
char Message[MaxY];
// 置错误代码
Error = ErrorCode;
if (NoShown)
{
// 不显示错误模式
return;
}
switch (ErrorCode)
{
case ErrorOpening:
// 打开文件错误
strcpy(Message, "Opening file error!");
break;
case ErrorSaving:
// 存储文件错误
strcpy(Message, "Saving file error!");
break;
case ErrorNoFreeMemoryInEdit:
// 在编辑状态下无可用内存报告
strcpy(Message, "No free memory. Reduce your codes.");
break;
case ErrorTooLong:
// 不能再添加新的行
strcpy(Message, "Cannot add a new line.");
break;
case ErrorPrint:
// 打印错误
strcpy(Message, "Print error.");
break;
case ErrorNoFreeMemoryInRun:
// 在运行状态下无可用内存报告
strcpy(Message, "No free memory. Reduce your variables.");
break;
case ErrorUnwantedPart:
// 语句后面有多余部分
strcpy(Message, "Unwanted tail after line");
break;
case ErrorVar:
// 非法的变量名
strcpy(Message, "Invalid variable name");
break;
case ErrorMissingAS:
// 缺少关键字AS
strcpy(Message, "Missing AS after variable");
break;
case ErrorMissingVarType:
// 缺少变量类型
strcpy(Message, "Missing variable type");
break;
case ErrorMissingArraySize:
// 缺少数组大小
strcpy(Message, "Missing array range size");
break;
case ErrorExpression:
// 表达式错误
strcpy(Message, "Error in expression");
break;
case ErrorMissingExpression:
// 缺少表达式
strcpy(Message, "Missing expression");
break;
case ErrorPrintSeparate:
// 非法的分隔符
strcpy(Message, "Invalid separate symbol");
break;
case ErrorQuotation:
// 字符串后缺少双引号
strcpy(Message, "Missing '\"' after string");
break;
case ErrorMustInteger:
// 循环变量必须为整数
sprintf(Message, "Must use integer variable '%s'", Extra);
break;
case ErrorUnmatchForVar:
// NEXT后的循环变量不匹配
sprintf(Message, "Unmatch loop variable '%s' after 'NEXT'", Extra);
break;
case ErrorMissingForVarGiveValue:
// FOR语句中缺少赋值语句
strcpy(Message, "Missing giving value to variable");
break;
case ErrorMissingTO:
// FOR语句中缺少TO
strcpy(Message, "Missing 'TO'");
break;
case ErrorMissingSTEP:
// FOR语句中缺少STEP
strcpy(Message, "Missing 'STEP'");
break;
case ErrorMissingNEXT:
// 缺少NEXT
strcpy(Message, "Missing 'NEXT' in program.");
break;
case ErrorUnwantedNEXT:
// 多余的NEXT语句
strcpy(Message, "Unwanted 'NEXT'");
break;
case ErrorUnwantedCONTINUE:
// 多余的CONTINUE语句
strcpy(Message, "Unwanted 'CONTINUE'");
break;
case ErrorUnwantedBREAK:
// 多余BREAK语句
strcpy(Message, "Unwanted 'BREAK'");
break;
case ErrorMoreFor:
// 太多的FOR语句
strcpy(Message, "Too many loops in program");
break;
case ErrorMoreNestFor:
// 太多的循环嵌套哦
strcpy(Message, "Too many nested loops in program");
break;
case ErrorMissingTHEN:
// 缺少THEN
strcpy(Message, "Missing 'THEN' or having unwanted tail");
break;
case ErrorMissingENDIF:
// 缺少ENDIF
strcpy(Message, "Missing 'END IF' in program.");
break;
case ErrorBool:
// 布尔表达式错误
strcpy(Message, "Boolean expression error");
break;
case ErrorUnwantedELSE:
// 多余的ELSE
strcpy(Message, "Unwanted 'ELSE'");
break;
case ErrorUnwantedENDIF:
// 多余的ENDIF
strcpy(Message, "Unwanted 'END IF'");
break;
case ErrorMoreIf:
// 太多的IF语句
strcpy(Message, "Too many 'IF' in program.");
break;
case ErrorMoreNestIf:
// 太多的IF嵌套
strcpy(Message, "Too many nested 'IF' in program.");
break;
case ErrorSubName:
// 错误的过程名
strcpy(Message, "Sub name error");
break;
case ErrorMissingSubName:
// 缺少过程名
strcpy(Message, "Missing sub name");
break;
case ErrorMissingENDSUB:
// 缺少ENDSUB
strcpy(Message, "Missing 'END SUB' in program.");
break;
case ErrorUnwantedENDSUB:
// 多余的END SUB
strcpy(Message, "Unwanted 'END SUB'");
break;
case ErrorUnwantedRETURN:
// 多余的RETURN语句
strcpy(Message, "Unwanted 'RETURN'");
break;
case ErrorMoreSub:
// 太多的过程
strcpy(Message, "Too many sub in program");
break;
case ErrorNoSuchSub:
// 无法找到此过程
sprintf(Message, "Can not find such sub '%s'", Extra);
break;
case ErrorSubPosition:
// 过程内不得再定义过程
strcpy(Message, "Sub position error");
break;
case ErrorMissingRange:
// 数组变量中缺少下标
strcpy(Message, "Missing range in array variable");
break;
case ErrorUnwantedComma:
// 多余的逗号
strcpy(Message, "Unwanted comma here");
break;
case ErrorRangeOverflow:
// 数组下标溢出
strcpy(Message, "Array variable range overflow");
break;
case ErrorLocatePara:
// LOCATE参数个数错误
strcpy(Message, "The bumber of locate parameter error");
break;
case ErrorCoordinate:
// LOCATE语句中坐标错误
strcpy(Message, "Coordinate in locate is wrong");
break;
case ErrorUndefined:
// 变量未定义
sprintf(Message, "Undefined variable '%s'", Extra);
break;
case ErrorDim:
// 数组维数不匹配
sprintf(Message, "Array dimension not match on '%s'", Extra);
break;
case ErrorMissingBracketInArray:
// 数组使用时缺少右括号
sprintf(Message, "Missing ')' at array variable %s", Extra);
break;
case ErrorMissingSubscript:
// 数组缺少下标
sprintf(Message, "Missing range subscript");
break;
case ErrorMissingVar:
// 缺少变量
strcpy(Message, "Missing variable name");
break;
case ErrorCannotDelArray:
// 不能删除数组变量的某个元素
strcpy(Message, "Can not delete array element");
break;
case ErrorDelayTime:
// 延迟时间错误
strcpy(Message, "Time of delay error");
break;
case ErrorRND:
// RND参数错误
strcpy(Message, "RND parameter error");
break;
case ErrorZeroDivision:
// 零做除数
strcpy(Message, "Divided by zero");
break;
case ErrorSyntax:
// 语法错误
strcpy(Message, "Syntax error");
break;
case ErrorMissingParameter:
// 在函数后面缺少参数
strcpy(Message, "Missing parameter after function");
break;
case ErrorInput:
// 输入错误
strcpy(Message, "Input not match");
break;
case ErrorSerious:
strcpy(Message, Extra);
exit(0);
default:
printf("No error message, add it. %d", Error);
int Key;
Receive(Key);
break;
}
// 警报
Sound();
// 得到最终显示信息
char Mess[MaxY] = "";
if (LineNo > -1)
{
sprintf(Mess, "%s at line %d", Message, LineNo + 1);
}
else
{
sprintf(Mess, " %s ", Message);
}
if (LineNo > -1)
{
// 有附带行号信息
puttext(1, 1, 80, 25, TextMirror);
// 设置错误行为当前行
TextX = LineNo;
TextY = LengthOf(TextX);
if (LineNo < x0 || LineNo >= x0 + winEdit.High())
{
// 超处当前屏
x0 = LineNo;
PrintText(winEdit.Top() + 1);
}
// 计算光标位置
NowX = LineNo - x0 + winEdit.Top() + 1;
NowY = winEdit.Left() + TextY + 1;
ShowPosition();
// 滚动垂直滚动条
winEdit.ScrollVertical(TextX);
}
// 显示错误窗口
int Len = strlen(Mess);
Window Error(6, (76 - Len) / 2 + 2, 10, (76 - Len) / 2 + Len + 5, true, false);
char ErrorTitle[15] = "";
sprintf(ErrorTitle, "Error %d#", ErrorCode);
Error.SetTitle(ErrorTitle);
Error.SetColor(WHITE, LIGHTGRAY, RED, LIGHTGRAY);
Error.Add(Mess);
Error.Show();
Error.Wait();
Error.Hide();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -