JScript运行时错误的简单分析
这篇文章主要提供给大家分享学习的是关于JScript运行时错误的简单分析,希望对大家有用。
JScript 运行时错误是指当 JScript 脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表达式、或者正在动态分配内存时出现 JScript 运行时错误时。
十进制 | 十六进制 | 说 明 | 十进制 | 十六进制 | 说 明 |
5 | 800A0005 | 非法过程调用或参数 | 5000 | 800A1388 | 不能给 'this' 赋值 |
6 | 800A0006 | 溢出 | 5001 | 800A1389 | 需要 Number 类型 |
7 | 800A0007 | 内存不足 | 5002 | 800A138A | 需要 Function 对象 |
9 | 800A0009 | 下标超界 | 5003 | 800A138B | 不能给函数返回值赋值 |
10 | 800A000A | 此数组被固定或临时锁定 | 5004 | 800A138C | 不能索引对象 |
11 | 800A000B | 零除错误 | 5005 | 800A138D | 需要 String |
13 | 800A000D | 类型失配 | 5006 | 800A138E | 需要 Date 对象 |
14 | 800A000E | 串空间不足 | 5007 | 800A138F | 需要 Object 类型 |
17 | 800A0011 | 不能执行所请求的操作 | 5008 | 800A1390 | 非法赋值 |
28 | 800A001C | 栈空间不足 | 5009 | 800A1391 | 未定义标识符 |
35 | 800A0023 | 子过程或函数未找到 | 5010 | 800A1392 | 需要 Boolean |
48 | 800A0030 | 装载DLL出错 | 5011 | 800A1393 | 不能执行来自一个自由脚本的代码 |
51 | 800A0033 | 内部出错 | 5012 | 800A1394 | 需要对象的成员 |
52 | 800A0034 | 坏文件名或数 | 5013 | 800A1395 | 需要 VBArray |
53 | 800A0035 | 文件未找到 | 5014 | 800A1396 | 需要 JScript 对象 |
54 | 800A0036 | 坏文件模式 | 5015 | 800A1397 | 需要 Enumerator 对象 |
55 | 800A0037 | 文件已经打开 | 5016 | 800A1398 | 需要正则表达式对象 |
57 | 800A0039 | 设备I/O错误 | 5017 | 800A1399 | 正则表达式语法错误 |
58 | 800A003A | 文件已经存在 | 5018 | 800A139A | 未预期的限定符 |
61 | 800A003D | 磁盘空间已满 | 5019 | 800A139B | 正则表达式中缺少“]” |
62 | 800A003E | 输入超出文件尾 | 5020 | 800A139C | 正则表达式中缺少“)” |
67 | 800A0043 | 文件太多 | 5021 | 800A139D | 字符集范围无效 |
68 | 800A0044 | 设备不可用 | 5022 | 800A139E | 异常抛出,但无法抓住 |
70 | 800A0046 | 权限禁用 | 5023 | 800A139F | 函数没有合法的 Prototype (原型) 对象 |
71 | 800A0047 | 磁盘未准备好 | 5024 | 800A13A0 | 待解码的 URI 包含有非法字符 |
74 | 800A004A | 不能用不同的驱动重命名 | 5025 | 800A13A1 | 待解码的 URI 编码非法 |
75 | 800A004B | 路径/文件访问错误 | 5026 | 800A13A2 | 小数部分的位数越界 |
76 | 800A004C | 路径未找到 | 5027 | 800A13A3 | 精度越界 |
91 | 800A005B | 对象变量或With块变量未设置 | 5028 | 800A13A4 | 需要 Array 或 arguments 对象 |
92 | 800A005C | For循环未初始化 | 5029 | 800A13A5 | 数组长度必须为一有限正整数 |
94 | 800A005E | Null使用无效 | 5030 | 800A13A6 | 必须赋给数组长度一个有限正数 |
322 | 800A0042 | 不能建立所需的临时文件 | |||
424 | 800A01A8 | 需要对象 | |||
429 | 800A01A9 | Automation服务器不能建立对象 | |||
430 | 800A01AE | 类不支持Automation | |||
432 | 800A01B0 | 在Automation操作中找不到文件名或类名 | |||
438 | 800A01B6 | 对象不支持这个属性或方法 | |||
440 | 800A01B8 | Automation错误 | |||
445 | 800S01BD | 对象不支持这个动作 | |||
446 | 800A01BE | 对象不支持指定的参数 | |||
447 | 800A01BF | 对象不支持当前区域设置 | |||
448 | 800A01C0 | 指定的参数未找到 | |||
449 | 800A01C1 | 参数不可选 | |||
450 | 800A01C2 | 错误的参数数目或非法属性分配 | |||
451 | 800A01C3 | 对象不是一个集合 | |||
453 | 800A01C5 | 指定的dll函数未找到 | |||
458 | 800A01CA | 变量使用了一个Jscript不支持的Automation类型 | |||
462 | 800A01CE | 远程服务器机器不存在或不可用 | |||
501 | 800A01F5 | 不能分配给变量 | |||
502 | 800A01F6 | 对象对于脚本不安全 | |||
503 | 800A01F7 | 对象对于初始化不安全 | |||
504 | 800A01F8 | 对象对建立不安全 |
不能给 'this' 赋值
试图给 this 赋值,this 是 JScript 关键字,表示:
- 当前正在执行某个方法的对象,
- 如果没有当前方法(或该方法不属于任何其它对象),则是指全局对象。
所谓方法就是由对象调用的 JScript 函数。在一个方法内, this 关键字代表调用该方法的对象的引用(这种情况下,就是指使用 new 操作符调用类构造函数所创建的对象)。
在一个方法内可以使用 this 来引用当前对象,但不能对其赋予新的值。
要改正此错误
- 不要试图对 this 赋值。要访问某个实例化对象的属性或方法,请使用点操作符(例如 circle.radius)。
注意 不能将用户创建的变量命名为 this;这是一个 JScript 保留字。
需要 Number 类型
试图对一个不是Number 类型的对象调用 Number.prototype.toString 或 Number.prototype.valueOf 方法。这种调用类型的对象必须是Number 类型。
要改正此错误
只调用Number 的Number.prototype.toString or Number.prototype.valueOf 方法。
需要 Function 对象
试图对一个不是 Function 对象调用 Function prototype 方法,或者在函数调用上下文中使用了对象。例如,下面的代码将产生该错误,因为 foo 不是一个函数。
var foo = new Object(); // 创建一个称为 "foo" 的新对象。 var x = foo(); // 试图将 foo 作为一个函数加以调用。
要改正此错误
- 只对 Function 对象调用 Function prototype 方法。
- 确保只使用函数调用操作符() 来调用函数。
不能给函数返回值赋
试图将一个值赋给函数结果。可以将函数结果赋给某个变量,但其本身不能用作变量。如果希望将一个新值赋给该函数本身,则不要圆括号(函数调用操作符)。下面的示例演示了产生这一错误的情形。
myFunction() = 42; // 试图强将 42 赋给该函数调用的结果。
要改正此错误
- 不要使用函数调用的值作为赋值对象。可以将函数调用的结果赋给某个变量。
myVar = myFunction(42);
- 或者,可以将函数本身(不是其返回数值)赋给一个变量。
myFunction = new Function("return 42;");
需要 String
试图对String对象类型之外的其他类型对象调用String.prototype.toString 或 String.prototype.valueOf 方法。这种调用的类型必须是 String 类型。
要改正此错误
- 在 String 类型对象中只能调用 String.prototype.toString 或 String.prototype.valueOf 方法
需要 Date 对象
试图对一个不是Date 类型的对象调用 Date.prototype.toString 或 Date.prototype.valueOf 方法。这种调用类型的对象必须是 Date 类型。例如:
var o = new Object; o.f = Date.prototype.toString; o.f();
要改正此错误
- 只能对Date 类型的对象调用 Date.prototype.toString 或者 Date.prototype.valueOf 方法。
需要 Object 类型
试图对一个不是Object 类型的对象调用 Object.prototype.toString 或Object.prototype.valueOf 方法。这种调用类型的对象必须是 Object 类型。
要改正此错误
只调用Object 的 Object.prototype.toString 或 Object.prototype.valueOf 方法。
非法赋值
试图对一个只读的标识符赋值。不能对只读的标识符赋值。例如,主机定义对象和外部 COM 对象。
要改正此错误
- 不要赋值给只读标识符。
未定义标识符
JScript 编译器不认识试图使用的标识符。当出现下述情况时,返回未定义值:
- 不存在的变量
- 变量已声明,但从未对其赋值
- 对象属性不存在。
要改正此错误
- 用 var 语句声明一个变量(如 var x)。
需要 Boolean
试图用一个不是 Boolean 类型的对象来调用 Boolean.prototype.toString 或者 Boolean.prototype.valueOf 方法。这种调用类型的对象必须是 Boolean 类型。例如:
var o = new Object; o.f = Boolean.prototype.toString; o.f();
要改正此错误
- 只使用 Boolean 类型的对象调用 Boolean.prototype.toString 或 Boolean.prototype.valueOf 方法。
需要对象的成员
试图对某个对象的数据成员执行某个操作,但该成员不存在。
要改正此错误
- 请确保所输入的数据成员名字是正确的。
需要 VBArray
所提供的对象不是所需要的 Visual Basic 中的 safeArray。
new VBArray(safeArray);
VBArrays 是只读的,且不能直接被创建。safeArray 参数为一个 VBArray 值,并且在被传递给 VBArray构造函数之前必须获得一个 VBArray 值。这个值只能通过检索现有的 ActiveX 或其他对象得到。
要改正此错误
- 请确保只将 VBArray 对象传递给 VBArray 构造函数。
需要 JScript 对象型
试图将一个非-JScript 对象传给需要 JScript对象的内置函数。各种内置函数都需要在 JScript 中定义的对象(与主机定义的对象和控件之类的外部组件相对)。
要改正此错误
- 请确保正在作为参数传递的对象具有正确的类型。
需要 Enumerator 对象
试图对一个非 Enumerator 类型的对象调用 Enumerator.prototype.atEnd、 Enumerator.prototype.item、 Enumerator.prototype.moveFirst 或者 Enumerator.prototype.moveNext 方法。这种调用类型的对象必须是 Enumerator 类型。下面是违反这个规则的代码示例:
var o = new Object; o.f = Enumerator.prototype.atEnd; o.f();
要改正此错误
- 只能对Enumerator 类型的对象调用其 Enumerator.prototype.atEnd、Enumerator.prototype.item、Enumerator.prototype.moveFirst 或者 Enumerator.prototype.moveNext 方法。要查找某个对象是否为 Enumerator 对象,请使用:
if(x instanceof Enumerator)
需要正则表达式对象
试图对RegExp类型对象之外的其他对象调用 RegExp.prototype.toString 或 RegExp.prototype.valueOf方法。这种调用的类型必须是 RegExp 对象。
要改正此错误
- 在 RegExp 对象类型 中,只能调用RegExp.prototype.toString 或 RegExp.prototype.valueOf 方法
正则表达式语法错误
查找字符串的结构违反了一条或多条关于 JScript 正则表达式的语法规则。
要改正此错误
- 确保正则表达式查找字符串的结构与 JScript 正则字符串的语法一致。
未预期的限定符
在组织正则表达式的查找模式时,创建了一个带有非法循环因子的模式元素。例如,模式
/^+/
是非法的,因为元素 ^(输入开始)没有循环因子。下表列出了没有循环因子的元素:
元素 | 描述 |
---|---|
^ | 输入开始 |
$ | 输入结束 |
\b | 词的边界 |
\B | 非单词的边界 |
* | 零个或多个循环 |
+ | 零个或多个循环 |
? | 零个或多个循环 |
{n} | n 循环 |
{n,} | n 或多个循环 |
{n,m} | 从 n 到 m 循环,包括 m |
要改正此错误
- 请确保查找模式元素仅包括合法的循环因子。
正则表达式中缺少 ']'
试图创建一个用于正则表达式匹配的字符类,但是没有右中括号。单个的文字字符组合可以用括号括起来表示一个字符类。一个字符类可以匹配其中包含的任一字符。例如,/[abc]/ 可以匹配字母 “a”, “b”, 或 “c” 的任何一个。
要改正此错误
- 给正则表达式加上右中括号。
注意 如果想匹配单中括号,可以使用反斜杠将其转义 - \( - 这样就不会被JScript 解释为特殊字符。)
正则表达式中缺少 ')'
试图创建一个正则表达式捕获、断言和组合,但不包括结束圆括号。正则表达式中的圆括号有多个用途。首先,它们主要用来抓捕子表达式,指定断言、或将模式组合,从而通过 *、+、? 等等使这些项被看作一个单一的单位。
要改正此错误
- 加上最右边的结束圆括号。
注意 如果想匹配单括号,可以使用反斜杠将其转义 - \( - 这样就不会被 JScript 解释为特殊字符。)
字符集范围无效
试图创建的正则表达式含有无效的字符集范围。字符集的范围必须只能是单个字符的变化,诸如a-z 或 0-9;不能在字符集中包括诸如 \w 的字符类。字符集范围的第一个字符也必须位于范围中第二个字符的前面。例如:
var good = /[a-z]/; // 有效的字符范围 - a 在 z 之前。 var notGood = /[z-a]/; // 无效的字符范围 - z 不在 a 之前。
要改正此错误
- 只使用单字符来组合正则表达式字符集,并确保他们具有正确的顺序。
异常抛出,但无法抓住
在代码中包括了一条 throw 语句,但没有将其包含在某个 try 语句块内,或者没有相关的 catch 语句块来捕获错误。异常是在 try 语句块中使用 throw 语句被抛出,并且应该由 try 语句块外的 catch 语句抓住。
要改正此错误
- 用 try 语句块将可能产生异常的代码封住,并确保外面有一个相应的 catch 语句块。
- 确认 catch 语句中为正确的异常格式。
- 如果异常被再次抛出,确认存在相应的 catch 语句。
函数没有合法的 prototype 对象
试图使用 instanceof 来确定一个对象是否是从某个特定函数类派生而来,但重新定义的该对象的prototype 属性要么是空的,要么是外部对象类型(都不是有效的JScript 对象)。外部对象可能来自主机对象模型(例如, Internet Explorer 的产品和 window 产品,或一个外部的COM 对象)。
要改正此错误
- 确保函数的 prototype 属性引用了合法的 JScript。
待编码的 URI 包含有非法字符
试图将字符串编码得到 URI(通用资源标识符),但是包含非法字符。尽管字符串中的绝大多数字符都是合法的,可以转换为 URI,但有些 Unicode 字符序列是非法的。
要改正此错误
请确保待编码的字符串只包含合法的 Unicode 序列。
一个完整的 URI 是由一系列部件和分隔符组成的。其通用格式为:
<Scheme>:<first>/<second>;<third>?<fourth>
尖括号内的名称代表部件,而 “:”, “/”, “;” 和 “?” 都是作为分隔符的保留字。
待解码 URI 的编码非法
试图对一个不正确 URI(通用资源标识符)进行解码。URI 具有特殊的语法;绝大多数非字母数字字符在用于 URI 必须加以编码。可以使用 encodeURI 和 encodeURIComponent 方法从一个标准的 JScript 字符串创建一个 URI。
一个完整的 URI 是由一系列部件和分隔符组成的。其通用格式为:
<Scheme>:<first>/<second>;<third>?<fourth>
尖括号内的名称代表部件,而 “:”, “/”, “;” 和 “?” 都是作为分隔符的保留字。
要改正此错误
- 请确保您只需要对合法的 URI 进行解码。你不能对标准的 JScript 字符串解码,因为它们可能含有非法字符。
小数部分的位数越界
试图将一个非法参数传递给Number.prototype.toExponential()。函数toExponential() 的参数为 0 到 20(含 20)之间。
要改正此错误
- 请确保的 toExponential() 不是太大也不是太小。
精度越界
试图将一个非法参数传递给 Number.prototype.toPrecision。 给 toPrecision 的参数必须为 1 到 21(含21)之间。
要改正此错误
- 请确保 toPrecision 不是太大也不是太小。
需要 Array 或 arguments 对象
没有将数组作为参数。这个错误只在 Function.prototype.apply方法中发生。如果使用这个函数,则该函数的第二个参数要么是 Array 对象,要么是 Arguments 对象。
要改正此错误
- 指定一个 Array 或 Arguments 对象作为第二个参数。
数组长度必须是一个有限正整数
在调用 Array 构造函数时使用的参数不是自然数(所谓自然数就是零加上正整数集合)。
要改正此错误
在创建一个新的 Array 对象时只能使用正整数。如果要创建一个只有一个元素且不是整数的数组,请执行下面两步操作。首先,创建一个只有一个元素的数组,然后将这个值赋给第一个元素 (array[0])。下面的示例将产生这个错误。
var piArray = new Array(3.14159);
下面的示例演示了指定一个只有单个数值元素的数组的正确方法。
var piArray = new Array(1); piArray [0] = 3.14159;
数组大小没有上界限制,但不能超过整数的最大值(大约为40亿)。
必须赋给数组长度一个有限正整数
在对现有 Array 对象设置其 length 属性时,所指定的数组长度不是正整数,也不是零。如果给某个 Array 对象的 length 属性所赋的值时为负数或不是数值 (NaN) 时,就会产生这个错误。请注意 JScript 会自动将小数数值转换为整数。
要改正此错误
将一个正整数赋给 length 属性。数组大小没有上界限制,但不能超过整数的最大值(大约为40亿)。下面的示例演示了给 Array 对象的 length 属性赋值的正确方法。
var my_array = new Array(); my_array.length = 99;