//注册C语言错误处理问题 Namespace.register("U.CD.CE"); //所有错误类型全局变量! U.CD.CE.EI = [ [ "case label does not reduce to an integer constant", "GCC中,case语句后面只能跟常量,比如:1,2等,不能是表达式!也不能是变量" ], [ "duplicate case value", "Switch语句的每个case必须有一个唯一的常量表达式值。否则导致此类错误发生." ], [ "undeclared (first use in this function)", "前面的变量没有定义,需要明确定义为 int aaa,或者其他类型." ], [ "unknown type name ‘student’", "定义结构体时发生的错误,不知道的类型 student." ], [ "incompatible types when assigning to type ‘char[10]’ from type ‘char *’","不能给字符串数组直接赋值,只能用字符串拷贝函数strcpy拷贝。"], [ "expected ‘;’ before ‘for’", "for循环前面变量没有定义,错误在前面一句话。" ], ["expected ‘;’ before ‘int’", "在整形前面没有分号,其实是上一句前面少一个分号!"], ["unknown type name", "变量未定义,请定义为int 或者其他类型。"], ["expected ‘;’ before ‘)’ token", "在括号前要加分号!"], ["warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]", "printf打印语句%d必须对应一个变量"], ["stray", "不能输入中文字符!"] ]; U.CD.CE.Net = [ ["The name `printf' does not exist in the current context"," 系统中不存在此函数!"], ["Literal of type double cannot be implicitly converted to type `float'. Add suffix `f' to create a literal of this type", "浮点型变量定义必须在数字后面加f"], ["Unexpected symbol `class', expecting `.', `::', `;', `<', or `='","using语句后面没有加;分号"], ["does not contain a static `Main' method suitable for an entry point", "必须有一个名字为Main的静态函数"], ["Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type", "C#数组定义方法和C不一样,是这样定义的int[] i"], ["Array initializers can only be used in a variable or field initializer. Try using a new expression instead",""], ["An object reference is required to access non-static member `main.max(int, int)'", "方法必须定义为静态的才能给Main调用"], ["Array type specifier, [], must appear before parameter name",""], ["System.Console' does not contain a definition for `Wrtie'","输出语句的Write您打错了"], ["Wrong preprocessor directive",""], [], [] ]; U.CD.CE.Python = [ ["Non-ASCII character '\xe5' in file ./userfiles/cb58171ad95315b8bc6c3dc095b660b2.py on line 1, but no encoding declared", "暂时不支持中文!"], ["expected an indented block",""], [] ]; U.CD.CE.Ruby = [ ["undefined method `[]' for nil:NilClass", "Ruby循环和传统语言不一样,是小于等于,不是小于,意味着循环10次是从0到9,不是从0到10."], ["undefined local variable or method","没有定义的变量或者方法,需要定义!"], [] ] //-----------------------------------------------错误处理逻辑-------------------------------------------- //判断编译是否成功。 U.CD.CE.BuildErr = function (s) { var z = s.replace(/\r\n/g, '\n').split('\n'), i; for (i = 0; i < z.length; i++) if (z[i].indexOf('标准错误输出') > -1) return true; return false; } //默认的错误处理函数,不指定行数,也不定义帮助 U.CD.CE.DefErr = function (d, s) { s = s.replace(/标准错误输出:/g, ""); //替换掉所有标准错误输出只留下第一个 var z = s.replace(/\r\n/g, '\n').split('\n'), i; d.innerHTML = ""; //行号清空 for (i = 0; i < z.length; i++) { $$("div", { "className": "UCD_R_E_L", "innerText": z[i] }, d); } //绘制行号 } //C语言错误处理方法。 U.CD.CE.CErr = function (d, s) { var z = s.replace(/\r\n/g, '\n').split('\n'), t, b,i; d.innerHTML = ""; //行号清空 for (i = 0; i < z.length; i++) { //标准错误输出:./output/de135e620dfcb01a10d36297a54708c2.c:5:1: error: ‘asfdsadf’ undeclared (first use in this function) t = z[i].split(':'); //需要把上面的字符拆分出来,以指出具体错误。 t.splice(1, 1); //去掉output/文件名.物理删除 z[i] = t.join(':'); //合并截取掉的字符串输出。 //如果是错误输出,追加帮助信息,警告信息暂时不理,其他信息也不理了。 if (t[3] && t[3].trim() == "error") { b = $$("div", { "className": "UCD_R_E_L", "innerText": z[i], "onclick": [U.CD.CE.CErrLine, ([t, "retElement"])] }, d); $$("span", { "innerText": " 帮助", "className": "UCD_R_E_Help", "onclick": [[U.M.StopBubble], [U.CD.CE.CErrHelp, ([t])]] }, b); } else { $$("div", { "className": "UCD_R_E_L", "innerText": z[i] }, d); ; //绘制行号 } } } //单击错误时转到相应错误行。传入的参数为行列 U.CD.CE.CErrLine = function (t, o) { var l = $("#UCD_CT_Code_CT")[0], row; var r = t[1] - 1, c = t[2]; //如果数组第三位是错误,则智能标识错误。 if (U.CD.R.CErrF != null) U.CD.R.CErrF.style.backgroundColor = "white"; //把以前的错误信息颜色重置。 U.CD.R.CErrF = l.getElementsByTagName("div")[r]; U.CD.R.CErrF.style.backgroundColor = "red"; } //具体错误帮助 U.CD.CE.CErrHelp = function (t) { //首先判断是否已经有帮助在后面 var b = U.CD.CE.EI, i, r = null; for (i = 0; i < b.length; i++) { if (t[4].indexOf(b[i][0]) > -1) { r = b[i]; } } if (r) { U.UI.SUForms(r[1], "错误处理窗口", "UCD_R_ErrHelp", "color:red;", 300, 200); } else { alert("暂未收录此错误,请到反馈意见中添加此错误类型!"); } } //Nodejs错误处理,nodejs错误只会显示第一次出错的地方,有多个"标准错误输出:",需要截取掉。组成一行。 U.CD.CE.NodeErr = function (d, s) { s = s.replace(/标准错误输出:/g, ""); //替换掉所有标准错误输出只留下第一个 var z = s.replace(/\r\n/g, '\n').split('\n'), t, b; d.innerHTML = ""; //行号清空 for (i = 0; i < z.length; i++) { //如果是错误输出,追加帮助信息,警告信息暂时不理,其他信息也不理了。 if (z[i].indexOf("标准错误输出:test.js:")>-1) { b = $$("div", { "className": "UCD_R_E_L", "innerText": z[i], "onclick": [U.CD.CE.NodeErrLine, ([z[i], "retElement"])] }, d); $$("span", { "innerText": " 帮助", "className": "UCD_R_E_Help", "onclick": [[U.M.StopBubble], [U.CD.CE.NodeErrHelp, ([t])]] }, b); } else { $$("div", { "className": "UCD_R_E_L", "innerText": z[i] }, d); } //绘制行号 } } U.CD.CE.NodeErrLine = function (t, o) { var l = $("#UCD_CT_Code_CT")[0]; var r = parseInt(t.split(':')[2])-1; //如果数组第三位是错误,则智能标识错误。 if (U.CD.R.CErrF != null) U.CD.R.CErrF.style.backgroundColor = "white"; //把以前的错误信息颜色重置。 U.CD.R.CErrF = l.getElementsByTagName("div")[r]; U.CD.R.CErrF.style.backgroundColor = "red"; } U.CD.CE.NodeErrHelp = function () { //首先判断是否已经有帮助在后面 var b = U.CD.CE.EI, i, r = null; for (i = 0; i < b.length; i++) { if (t[4].indexOf(b[i][0]) > -1) { r = b[i]; } } if (r) { U.UI.SUForms(r[1], "错误处理窗口", "UCD_R_ErrHelp", "color:red;", 300, 200); } else { alert("暂未收录此错误,请到反馈意见中添加此错误类型!"); } } //PHP语言错误处理方法 U.CD.PHPErr = function (d, s) { } //--------------lisp语言错误处理方式----------------- //lisp语言由于bug的原因会报EFAULT Bad address错误,需要另外处理,以弹出正确结构。因为是Bug,暂时放在前台处理。 U.CD.CE.LispErr = function (d,s) { //判断标准错误输出和运行环境Linux+Lisp语言中间是否有字符,或者判断第二行是否有字符,如果程序错误z[2]中应该包含了标准错误输出 //lisp print语句会先换行导致z[1]为空 format不会先换行,所以这里有点麻烦 var z = s.replace(/\r\n/g, '\n').split('\n'), i, r = ""; var k = s.substring(17, s.indexOf("标准错误输出")); //截取"运行环境Linux+Lisp语言"和"标准错误输出"之间的字符串,如果为空则表示有错误 if (k.lTrim().length == 0) { //U.CD.CE.DefErr($("#UCD_CT_SM_IF")[0], "Linux+Lisp程序出错,请把 (format t \"hello\")语句放在第一行,逐行判断错误!"); U.CD.CE.DefErr($("#UCD_CT_SM_IF")[0], s); } //去掉标准错误字样,只显示正确结果 else { for (i = 0; i < z.length; i++) { if (z[i].indexOf("标准错误输出") > -1) break; else r += z[i] + "\n"; } U.CD.R.ORAsynOK(r); } }