JScript運(yùn)行時(shí)錯(cuò)誤的簡單分析
這篇文章主要提供給大家分享學(xué)習(xí)的是關(guān)于JScript運(yùn)行時(shí)錯(cuò)誤的簡單分析,希望對(duì)大家有用。
JScript 運(yùn)行時(shí)錯(cuò)誤是指當(dāng) JScript 腳本試圖執(zhí)行一個(gè)系統(tǒng)不能運(yùn)行的動(dòng)作時(shí)導(dǎo)致的錯(cuò)誤。當(dāng)正在運(yùn)行腳本、計(jì)算變量表達(dá)式、或者正在動(dòng)態(tài)分配內(nèi)存時(shí)出現(xiàn) JScript 運(yùn)行時(shí)錯(cuò)誤時(shí)。
十進(jìn)制 | 十六進(jìn)制 | 說 明 | 十進(jìn)制 | 十六進(jìn)制 | 說 明 |
5 | 800A0005 | 非法過程調(diào)用或參數(shù) | 5000 | 800A1388 | 不能給 'this' 賦值 |
6 | 800A0006 | 溢出 | 5001 | 800A1389 | 需要 Number 類型 |
7 | 800A0007 | 內(nèi)存不足 | 5002 | 800A138A | 需要 Function 對(duì)象 |
9 | 800A0009 | 下標(biāo)超界 | 5003 | 800A138B | 不能給函數(shù)返回值賦值 |
10 | 800A000A | 此數(shù)組被固定或臨時(shí)鎖定 | 5004 | 800A138C | 不能索引對(duì)象 |
11 | 800A000B | 零除錯(cuò)誤 | 5005 | 800A138D | 需要 String |
13 | 800A000D | 類型失配 | 5006 | 800A138E | 需要 Date 對(duì)象 |
14 | 800A000E | 串空間不足 | 5007 | 800A138F | 需要 Object 類型 |
17 | 800A0011 | 不能執(zhí)行所請(qǐng)求的操作 | 5008 | 800A1390 | 非法賦值 |
28 | 800A001C | ?臻g不足 | 5009 | 800A1391 | 未定義標(biāo)識(shí)符 |
35 | 800A0023 | 子過程或函數(shù)未找到 | 5010 | 800A1392 | 需要 Boolean |
48 | 800A0030 | 裝載DLL出錯(cuò) | 5011 | 800A1393 | 不能執(zhí)行來自一個(gè)自由腳本的代碼 |
51 | 800A0033 | 內(nèi)部出錯(cuò) | 5012 | 800A1394 | 需要對(duì)象的成員 |
52 | 800A0034 | 壞文件名或數(shù) | 5013 | 800A1395 | 需要 VBArray |
53 | 800A0035 | 文件未找到 | 5014 | 800A1396 | 需要 JScript 對(duì)象 |
54 | 800A0036 | 壞文件模式 | 5015 | 800A1397 | 需要 Enumerator 對(duì)象 |
55 | 800A0037 | 文件已經(jīng)打開 | 5016 | 800A1398 | 需要正則表達(dá)式對(duì)象 |
57 | 800A0039 | 設(shè)備I/O錯(cuò)誤 | 5017 | 800A1399 | 正則表達(dá)式語法錯(cuò)誤 |
58 | 800A003A | 文件已經(jīng)存在 | 5018 | 800A139A | 未預(yù)期的限定符 |
61 | 800A003D | 磁盤空間已滿 | 5019 | 800A139B | 正則表達(dá)式中缺少“]” |
62 | 800A003E | 輸入超出文件尾 | 5020 | 800A139C | 正則表達(dá)式中缺少“)” |
67 | 800A0043 | 文件太多 | 5021 | 800A139D | 字符集范圍無效 |
68 | 800A0044 | 設(shè)備不可用 | 5022 | 800A139E | 異常拋出,但無法抓住 |
70 | 800A0046 | 權(quán)限禁用 | 5023 | 800A139F | 函數(shù)沒有合法的 Prototype (原型) 對(duì)象 |
71 | 800A0047 | 磁盤未準(zhǔn)備好 | 5024 | 800A13A0 | 待解碼的 URI 包含有非法字符 |
74 | 800A004A | 不能用不同的驅(qū)動(dòng)重命名 | 5025 | 800A13A1 | 待解碼的 URI 編碼非法 |
75 | 800A004B | 路徑/文件訪問錯(cuò)誤 | 5026 | 800A13A2 | 小數(shù)部分的位數(shù)越界 |
76 | 800A004C | 路徑未找到 | 5027 | 800A13A3 | 精度越界 |
91 | 800A005B | 對(duì)象變量或With塊變量未設(shè)置 | 5028 | 800A13A4 | 需要 Array 或 arguments 對(duì)象 |
92 | 800A005C | For循環(huán)未初始化 | 5029 | 800A13A5 | 數(shù)組長度必須為一有限正整數(shù) |
94 | 800A005E | Null使用無效 | 5030 | 800A13A6 | 必須賦給數(shù)組長度一個(gè)有限正數(shù) |
322 | 800A0042 | 不能建立所需的臨時(shí)文件 | |||
424 | 800A01A8 | 需要對(duì)象 | |||
429 | 800A01A9 | Automation服務(wù)器不能建立對(duì)象 | |||
430 | 800A01AE | 類不支持Automation | |||
432 | 800A01B0 | 在Automation操作中找不到文件名或類名 | |||
438 | 800A01B6 | 對(duì)象不支持這個(gè)屬性或方法 | |||
440 | 800A01B8 | Automation錯(cuò)誤 | |||
445 | 800S01BD | 對(duì)象不支持這個(gè)動(dòng)作 | |||
446 | 800A01BE | 對(duì)象不支持指定的參數(shù) | |||
447 | 800A01BF | 對(duì)象不支持當(dāng)前區(qū)域設(shè)置 | |||
448 | 800A01C0 | 指定的參數(shù)未找到 | |||
449 | 800A01C1 | 參數(shù)不可選 | |||
450 | 800A01C2 | 錯(cuò)誤的參數(shù)數(shù)目或非法屬性分配 | |||
451 | 800A01C3 | 對(duì)象不是一個(gè)集合 | |||
453 | 800A01C5 | 指定的dll函數(shù)未找到 | |||
458 | 800A01CA | 變量使用了一個(gè)Jscript不支持的Automation類型 | |||
462 | 800A01CE | 遠(yuǎn)程服務(wù)器機(jī)器不存在或不可用 | |||
501 | 800A01F5 | 不能分配給變量 | |||
502 | 800A01F6 | 對(duì)象對(duì)于腳本不安全 | |||
503 | 800A01F7 | 對(duì)象對(duì)于初始化不安全 | |||
504 | 800A01F8 | 對(duì)象對(duì)建立不安全 |
不能給 'this' 賦值
試圖給 this 賦值,this 是 JScript 關(guān)鍵字,表示:
- 當(dāng)前正在執(zhí)行某個(gè)方法的對(duì)象,
- 如果沒有當(dāng)前方法(或該方法不屬于任何其它對(duì)象),則是指全局對(duì)象。
所謂方法就是由對(duì)象調(diào)用的 JScript 函數(shù)。在一個(gè)方法內(nèi), this 關(guān)鍵字代表調(diào)用該方法的對(duì)象的引用(這種情況下,就是指使用 new 操作符調(diào)用類構(gòu)造函數(shù)所創(chuàng)建的對(duì)象)。
在一個(gè)方法內(nèi)可以使用 this 來引用當(dāng)前對(duì)象,但不能對(duì)其賦予新的值。
要改正此錯(cuò)誤
- 不要試圖對(duì) this 賦值。要訪問某個(gè)實(shí)例化對(duì)象的屬性或方法,請(qǐng)使用點(diǎn)操作符(例如 circle.radius)。
注意 不能將用戶創(chuàng)建的變量命名為 this;這是一個(gè) JScript 保留字。
需要 Number 類型
試圖對(duì)一個(gè)不是Number 類型的對(duì)象調(diào)用 Number.prototype.toString 或 Number.prototype.valueOf 方法。這種調(diào)用類型的對(duì)象必須是Number 類型。
要改正此錯(cuò)誤
只調(diào)用Number 的Number.prototype.toString or Number.prototype.valueOf 方法。
需要 Function 對(duì)象
試圖對(duì)一個(gè)不是 Function 對(duì)象調(diào)用 Function prototype 方法,或者在函數(shù)調(diào)用上下文中使用了對(duì)象。例如,下面的代碼將產(chǎn)生該錯(cuò)誤,因?yàn)?foo 不是一個(gè)函數(shù)。
var foo = new Object(); // 創(chuàng)建一個(gè)稱為 "foo" 的新對(duì)象。 var x = foo(); // 試圖將 foo 作為一個(gè)函數(shù)加以調(diào)用。
要改正此錯(cuò)誤
- 只對(duì) Function 對(duì)象調(diào)用 Function prototype 方法。
- 確保只使用函數(shù)調(diào)用操作符() 來調(diào)用函數(shù)。
不能給函數(shù)返回值賦
試圖將一個(gè)值賦給函數(shù)結(jié)果。可以將函數(shù)結(jié)果賦給某個(gè)變量,但其本身不能用作變量。如果希望將一個(gè)新值賦給該函數(shù)本身,則不要圓括號(hào)(函數(shù)調(diào)用操作符)。下面的示例演示了產(chǎn)生這一錯(cuò)誤的情形。
myFunction() = 42; // 試圖強(qiáng)將 42 賦給該函數(shù)調(diào)用的結(jié)果。
要改正此錯(cuò)誤
- 不要使用函數(shù)調(diào)用的值作為賦值對(duì)象?梢詫⒑瘮(shù)調(diào)用的結(jié)果賦給某個(gè)變量。
myVar = myFunction(42);
- 或者,可以將函數(shù)本身(不是其返回?cái)?shù)值)賦給一個(gè)變量。
myFunction = new Function("return 42;");
需要 String
試圖對(duì)String對(duì)象類型之外的其他類型對(duì)象調(diào)用String.prototype.toString 或 String.prototype.valueOf 方法。這種調(diào)用的類型必須是 String 類型。
要改正此錯(cuò)誤
- 在 String 類型對(duì)象中只能調(diào)用 String.prototype.toString 或 String.prototype.valueOf 方法
需要 Date 對(duì)象
試圖對(duì)一個(gè)不是Date 類型的對(duì)象調(diào)用 Date.prototype.toString 或 Date.prototype.valueOf 方法。這種調(diào)用類型的對(duì)象必須是 Date 類型。例如:
var o = new Object; o.f = Date.prototype.toString; o.f();
要改正此錯(cuò)誤
- 只能對(duì)Date 類型的對(duì)象調(diào)用 Date.prototype.toString 或者 Date.prototype.valueOf 方法。
需要 Object 類型
試圖對(duì)一個(gè)不是Object 類型的對(duì)象調(diào)用 Object.prototype.toString 或Object.prototype.valueOf 方法。這種調(diào)用類型的對(duì)象必須是 Object 類型。
要改正此錯(cuò)誤
只調(diào)用Object 的 Object.prototype.toString 或 Object.prototype.valueOf 方法。
非法賦值
試圖對(duì)一個(gè)只讀的標(biāo)識(shí)符賦值。不能對(duì)只讀的標(biāo)識(shí)符賦值。例如,主機(jī)定義對(duì)象和外部 COM 對(duì)象。
要改正此錯(cuò)誤
- 不要賦值給只讀標(biāo)識(shí)符。
未定義標(biāo)識(shí)符
JScript 編譯器不認(rèn)識(shí)試圖使用的標(biāo)識(shí)符。當(dāng)出現(xiàn)下述情況時(shí),返回未定義值:
- 不存在的變量
- 變量已聲明,但從未對(duì)其賦值
- 對(duì)象屬性不存在。
要改正此錯(cuò)誤
- 用 var 語句聲明一個(gè)變量(如 var x)。
需要 Boolean
試圖用一個(gè)不是 Boolean 類型的對(duì)象來調(diào)用 Boolean.prototype.toString 或者 Boolean.prototype.valueOf 方法。這種調(diào)用類型的對(duì)象必須是 Boolean 類型。例如:
var o = new Object; o.f = Boolean.prototype.toString; o.f();
要改正此錯(cuò)誤
- 只使用 Boolean 類型的對(duì)象調(diào)用 Boolean.prototype.toString 或 Boolean.prototype.valueOf 方法。
需要對(duì)象的成員
試圖對(duì)某個(gè)對(duì)象的數(shù)據(jù)成員執(zhí)行某個(gè)操作,但該成員不存在。
要改正此錯(cuò)誤
- 請(qǐng)確保所輸入的數(shù)據(jù)成員名字是正確的。
需要 VBArray
所提供的對(duì)象不是所需要的 Visual Basic 中的 safeArray。
new VBArray(safeArray);
VBArrays 是只讀的,且不能直接被創(chuàng)建。safeArray 參數(shù)為一個(gè) VBArray 值,并且在被傳遞給 VBArray構(gòu)造函數(shù)之前必須獲得一個(gè) VBArray 值。這個(gè)值只能通過檢索現(xiàn)有的 ActiveX 或其他對(duì)象得到。
要改正此錯(cuò)誤
- 請(qǐng)確保只將 VBArray 對(duì)象傳遞給 VBArray 構(gòu)造函數(shù)。
需要 JScript 對(duì)象型
試圖將一個(gè)非-JScript 對(duì)象傳給需要 JScript對(duì)象的內(nèi)置函數(shù)。各種內(nèi)置函數(shù)都需要在 JScript 中定義的對(duì)象(與主機(jī)定義的對(duì)象和控件之類的外部組件相對(duì))。
要改正此錯(cuò)誤
- 請(qǐng)確保正在作為參數(shù)傳遞的對(duì)象具有正確的類型。
需要 Enumerator 對(duì)象
試圖對(duì)一個(gè)非 Enumerator 類型的對(duì)象調(diào)用 Enumerator.prototype.atEnd、 Enumerator.prototype.item、 Enumerator.prototype.moveFirst 或者 Enumerator.prototype.moveNext 方法。這種調(diào)用類型的對(duì)象必須是 Enumerator 類型。下面是違反這個(gè)規(guī)則的代碼示例:
var o = new Object; o.f = Enumerator.prototype.atEnd; o.f();
要改正此錯(cuò)誤
- 只能對(duì)Enumerator 類型的對(duì)象調(diào)用其 Enumerator.prototype.atEnd、Enumerator.prototype.item、Enumerator.prototype.moveFirst 或者 Enumerator.prototype.moveNext 方法。要查找某個(gè)對(duì)象是否為 Enumerator 對(duì)象,請(qǐng)使用:
if(x instanceof Enumerator)
需要正則表達(dá)式對(duì)象
試圖對(duì)RegExp類型對(duì)象之外的其他對(duì)象調(diào)用 RegExp.prototype.toString 或 RegExp.prototype.valueOf方法。這種調(diào)用的類型必須是 RegExp 對(duì)象。
要改正此錯(cuò)誤
- 在 RegExp 對(duì)象類型 中,只能調(diào)用RegExp.prototype.toString 或 RegExp.prototype.valueOf 方法
正則表達(dá)式語法錯(cuò)誤
查找字符串的結(jié)構(gòu)違反了一條或多條關(guān)于 JScript 正則表達(dá)式的語法規(guī)則。
要改正此錯(cuò)誤
- 確保正則表達(dá)式查找字符串的結(jié)構(gòu)與 JScript 正則字符串的語法一致。
未預(yù)期的限定符
在組織正則表達(dá)式的查找模式時(shí),創(chuàng)建了一個(gè)帶有非法循環(huán)因子的模式元素。例如,模式
/^+/
是非法的,因?yàn)樵?^(輸入開始)沒有循環(huán)因子。下表列出了沒有循環(huán)因子的元素:
元素 | 描述 |
---|---|
^ | 輸入開始 |
$ | 輸入結(jié)束 |
\b | 詞的邊界 |
\B | 非單詞的邊界 |
* | 零個(gè)或多個(gè)循環(huán) |
+ | 零個(gè)或多個(gè)循環(huán) |
? | 零個(gè)或多個(gè)循環(huán) |
{n} | n 循環(huán) |
{n,} | n 或多個(gè)循環(huán) |
{n,m} | 從 n 到 m 循環(huán),包括 m |
要改正此錯(cuò)誤
- 請(qǐng)確保查找模式元素僅包括合法的循環(huán)因子。
正則表達(dá)式中缺少 ']'
試圖創(chuàng)建一個(gè)用于正則表達(dá)式匹配的字符類,但是沒有右中括號(hào)。單個(gè)的文字字符組合可以用括號(hào)括起來表示一個(gè)字符類。一個(gè)字符類可以匹配其中包含的任一字符。例如,/[abc]/ 可以匹配字母 “a”, “b”, 或 “c” 的任何一個(gè)。
要改正此錯(cuò)誤
- 給正則表達(dá)式加上右中括號(hào)。
注意 如果想匹配單中括號(hào),可以使用反斜杠將其轉(zhuǎn)義 - \( - 這樣就不會(huì)被JScript 解釋為特殊字符。)
正則表達(dá)式中缺少 ')'
試圖創(chuàng)建一個(gè)正則表達(dá)式捕獲、斷言和組合,但不包括結(jié)束圓括號(hào)。正則表達(dá)式中的圓括號(hào)有多個(gè)用途。首先,它們主要用來抓捕子表達(dá)式,指定斷言、或?qū)⒛J浇M合,從而通過 *、+、? 等等使這些項(xiàng)被看作一個(gè)單一的單位。
要改正此錯(cuò)誤
- 加上最右邊的結(jié)束圓括號(hào)。
注意 如果想匹配單括號(hào),可以使用反斜杠將其轉(zhuǎn)義 - \( - 這樣就不會(huì)被 JScript 解釋為特殊字符。)
字符集范圍無效
試圖創(chuàng)建的正則表達(dá)式含有無效的字符集范圍。字符集的范圍必須只能是單個(gè)字符的變化,諸如a-z 或 0-9;不能在字符集中包括諸如 \w 的字符類。字符集范圍的第一個(gè)字符也必須位于范圍中第二個(gè)字符的前面。例如:
var good = /[a-z]/; // 有效的字符范圍 - a 在 z 之前。 var notGood = /[z-a]/; // 無效的字符范圍 - z 不在 a 之前。
要改正此錯(cuò)誤
- 只使用單字符來組合正則表達(dá)式字符集,并確保他們具有正確的順序。
異常拋出,但無法抓住
在代碼中包括了一條 throw 語句,但沒有將其包含在某個(gè) try 語句塊內(nèi),或者沒有相關(guān)的 catch 語句塊來捕獲錯(cuò)誤。異常是在 try 語句塊中使用 throw 語句被拋出,并且應(yīng)該由 try 語句塊外的 catch 語句抓住。
要改正此錯(cuò)誤
- 用 try 語句塊將可能產(chǎn)生異常的代碼封住,并確保外面有一個(gè)相應(yīng)的 catch 語句塊。
- 確認(rèn) catch 語句中為正確的異常格式。
- 如果異常被再次拋出,確認(rèn)存在相應(yīng)的 catch 語句。
函數(shù)沒有合法的 prototype 對(duì)象
試圖使用 instanceof 來確定一個(gè)對(duì)象是否是從某個(gè)特定函數(shù)類派生而來,但重新定義的該對(duì)象的prototype 屬性要么是空的,要么是外部對(duì)象類型(都不是有效的JScript 對(duì)象)。外部對(duì)象可能來自主機(jī)對(duì)象模型(例如, Internet Explorer 的產(chǎn)品和 window 產(chǎn)品,或一個(gè)外部的COM 對(duì)象)。
要改正此錯(cuò)誤
- 確保函數(shù)的 prototype 屬性引用了合法的 JScript。
待編碼的 URI 包含有非法字符
試圖將字符串編碼得到 URI(通用資源標(biāo)識(shí)符),但是包含非法字符。盡管字符串中的絕大多數(shù)字符都是合法的,可以轉(zhuǎn)換為 URI,但有些 Unicode 字符序列是非法的。
要改正此錯(cuò)誤
請(qǐng)確保待編碼的字符串只包含合法的 Unicode 序列。
一個(gè)完整的 URI 是由一系列部件和分隔符組成的。其通用格式為:
<Scheme>:<first>/<second>;<third>?<fourth>
尖括號(hào)內(nèi)的名稱代表部件,而 “:”, “/”, “;” 和 “?” 都是作為分隔符的保留字。
待解碼 URI 的編碼非法
試圖對(duì)一個(gè)不正確 URI(通用資源標(biāo)識(shí)符)進(jìn)行解碼。URI 具有特殊的語法;絕大多數(shù)非字母數(shù)字字符在用于 URI 必須加以編碼?梢允褂 encodeURI 和 encodeURIComponent 方法從一個(gè)標(biāo)準(zhǔn)的 JScript 字符串創(chuàng)建一個(gè) URI。
一個(gè)完整的 URI 是由一系列部件和分隔符組成的。其通用格式為:
<Scheme>:<first>/<second>;<third>?<fourth>
尖括號(hào)內(nèi)的名稱代表部件,而 “:”, “/”, “;” 和 “?” 都是作為分隔符的保留字。
要改正此錯(cuò)誤
- 請(qǐng)確保您只需要對(duì)合法的 URI 進(jìn)行解碼。你不能對(duì)標(biāo)準(zhǔn)的 JScript 字符串解碼,因?yàn)樗鼈兛赡芎蟹欠ㄗ址?
小數(shù)部分的位數(shù)越界
試圖將一個(gè)非法參數(shù)傳遞給Number.prototype.toExponential()。函數(shù)toExponential() 的參數(shù)為 0 到 20(含 20)之間。
要改正此錯(cuò)誤
- 請(qǐng)確保的 toExponential() 不是太大也不是太小。
精度越界
試圖將一個(gè)非法參數(shù)傳遞給 Number.prototype.toPrecision。 給 toPrecision 的參數(shù)必須為 1 到 21(含21)之間。
要改正此錯(cuò)誤
- 請(qǐng)確保 toPrecision 不是太大也不是太小。
需要 Array 或 arguments 對(duì)象
沒有將數(shù)組作為參數(shù)。這個(gè)錯(cuò)誤只在 Function.prototype.apply方法中發(fā)生。如果使用這個(gè)函數(shù),則該函數(shù)的第二個(gè)參數(shù)要么是 Array 對(duì)象,要么是 Arguments 對(duì)象。
要改正此錯(cuò)誤
- 指定一個(gè) Array 或 Arguments 對(duì)象作為第二個(gè)參數(shù)。
數(shù)組長度必須是一個(gè)有限正整數(shù)
在調(diào)用 Array 構(gòu)造函數(shù)時(shí)使用的參數(shù)不是自然數(shù)(所謂自然數(shù)就是零加上正整數(shù)集合)。
要改正此錯(cuò)誤
在創(chuàng)建一個(gè)新的 Array 對(duì)象時(shí)只能使用正整數(shù)。如果要?jiǎng)?chuàng)建一個(gè)只有一個(gè)元素且不是整數(shù)的數(shù)組,請(qǐng)執(zhí)行下面兩步操作。首先,創(chuàng)建一個(gè)只有一個(gè)元素的數(shù)組,然后將這個(gè)值賦給第一個(gè)元素 (array[0])。下面的示例將產(chǎn)生這個(gè)錯(cuò)誤。
var piArray = new Array(3.14159);
下面的示例演示了指定一個(gè)只有單個(gè)數(shù)值元素的數(shù)組的正確方法。
var piArray = new Array(1); piArray [0] = 3.14159;
數(shù)組大小沒有上界限制,但不能超過整數(shù)的最大值(大約為40億)。
必須賦給數(shù)組長度一個(gè)有限正整數(shù)
在對(duì)現(xiàn)有 Array 對(duì)象設(shè)置其 length 屬性時(shí),所指定的數(shù)組長度不是正整數(shù),也不是零。如果給某個(gè) Array 對(duì)象的 length 屬性所賦的值時(shí)為負(fù)數(shù)或不是數(shù)值 (NaN) 時(shí),就會(huì)產(chǎn)生這個(gè)錯(cuò)誤。請(qǐng)注意 JScript 會(huì)自動(dòng)將小數(shù)數(shù)值轉(zhuǎn)換為整數(shù)。
要改正此錯(cuò)誤
將一個(gè)正整數(shù)賦給 length 屬性。數(shù)組大小沒有上界限制,但不能超過整數(shù)的最大值(大約為40億)。下面的示例演示了給 Array 對(duì)象的 length 屬性賦值的正確方法。
var my_array = new Array(); my_array.length = 99;