JScript运行时错误的简单分析

作者: 2011/6/26 11:24:46

这篇文章主要提供给大家分享学习的是关于JScript运行时错误的简单分析,希望对大家有用。

JScript 运行时错误是指当 JScript 脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表达式、或者正在动态分配内存时出现 JScript 运行时错误时。

十进制十六进制说 明十进制十六进制说 明
5800A0005非法过程调用或参数5000800A1388不能给 'this' 赋值
6800A0006溢出5001800A1389需要 Number 类型
7800A0007内存不足5002800A138A需要 Function 对象
9800A0009下标超界5003800A138B不能给函数返回值赋值
10800A000A此数组被固定或临时锁定5004800A138C不能索引对象
11800A000B零除错误5005800A138D需要 String
13800A000D类型失配5006800A138E需要 Date 对象
14800A000E串空间不足5007800A138F需要 Object 类型
17800A0011不能执行所请求的操作5008800A1390非法赋值
28800A001C栈空间不足5009800A1391未定义标识符
35800A0023子过程或函数未找到5010800A1392需要 Boolean
48800A0030装载DLL出错5011800A1393不能执行来自一个自由脚本的代码
51800A0033内部出错5012800A1394需要对象的成员
52800A0034坏文件名或数5013800A1395需要 VBArray
53800A0035文件未找到5014800A1396需要 JScript 对象
54800A0036坏文件模式5015800A1397需要 Enumerator 对象
55800A0037文件已经打开5016800A1398需要正则表达式对象
57800A0039设备I/O错误5017800A1399正则表达式语法错误
58800A003A文件已经存在5018800A139A未预期的限定符
61800A003D磁盘空间已满5019800A139B正则表达式中缺少“]”
62800A003E输入超出文件尾5020800A139C正则表达式中缺少“)”
67800A0043文件太多5021800A139D字符集范围无效
68800A0044设备不可用5022800A139E异常抛出,但无法抓住
70800A0046权限禁用5023800A139F函数没有合法的 Prototype (原型) 对象
71800A0047磁盘未准备好5024800A13A0待解码的 URI 包含有非法字符
74800A004A不能用不同的驱动重命名5025800A13A1待解码的 URI 编码非法
75800A004B路径/文件访问错误5026800A13A2小数部分的位数越界
76800A004C路径未找到5027800A13A3精度越界
91800A005B对象变量或With块变量未设置5028800A13A4需要 Array 或 arguments 对象
92800A005CFor循环未初始化5029800A13A5数组长度必须为一有限正整数
94800A005ENull使用无效5030800A13A6必须赋给数组长度一个有限正数
322800A0042不能建立所需的临时文件
424800A01A8需要对象
429800A01A9Automation服务器不能建立对象
430800A01AE类不支持Automation
432800A01B0在Automation操作中找不到文件名或类名
438800A01B6对象不支持这个属性或方法
440800A01B8Automation错误
445800S01BD对象不支持这个动作
446800A01BE对象不支持指定的参数
447800A01BF对象不支持当前区域设置
448800A01C0指定的参数未找到
449800A01C1参数不可选
450800A01C2错误的参数数目或非法属性分配
451800A01C3对象不是一个集合
453800A01C5指定的dll函数未找到
458800A01CA变量使用了一个Jscript不支持的Automation类型
462800A01CE远程服务器机器不存在或不可用
501800A01F5不能分配给变量
502800A01F6对象对于脚本不安全
503800A01F7对象对于初始化不安全
504800A01F8对象对建立不安全
 
不能给 'this' 赋值

试图给 this 赋值,this 是 JScript 关键字,表示:

  • 当前正在执行某个方法的对象,
  • 如果没有当前方法(或该方法不属于任何其它对象),则是指全局对象。

所谓方法就是由对象调用的 JScript 函数。在一个方法内, this 关键字代表调用该方法的对象的引用(这种情况下,就是指使用 new 操作符调用类构造函数所创建的对象)。

在一个方法内可以使用 this 来引用当前对象,但不能对其赋予新的值。

要改正此错误

  • 不要试图对 this 赋值。要访问某个实例化对象的属性或方法,请使用点操作符(例如 circle.radius)。

注意 不能将用户创建的变量命名为 this;这是一个 JScript 保留字。


需要 Number 类型

试图对一个不是Number 类型的对象调用 Number.prototype.toStringNumber.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.toStringString.prototype.valueOf 方法。这种调用的类型必须是 String 类型。

要改正此错误

  • String 类型对象中只能调用 String.prototype.toStringString.prototype.valueOf 方法

需要 Date 对象

试图对一个不是Date 类型的对象调用 Date.prototype.toStringDate.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.toStringObject.prototype.valueOf 方法。这种调用类型的对象必须是 Object 类型。

要改正此错误

只调用Object Object.prototype.toStringObject.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.toStringBoolean.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.toStringRegExp.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 必须加以编码。可以使用 encodeURIencodeURIComponent 方法从一个标准的 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;

特别推荐

玩家留言 跟帖评论
查看更多评论