當(dāng)前位置:首頁文章首頁 IT學(xué)院 IT技術(shù)

JScript運(yùn)行時(shí)錯(cuò)誤的簡單分析

作者:  來源:  發(fā)布時(shí)間:2011-6-26 11:24:46  點(diǎn)擊:

這篇文章主要提供給大家分享學(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)制說 明
5800A0005非法過程調(diào)用或參數(shù)5000800A1388不能給 'this' 賦值
6800A0006溢出5001800A1389需要 Number 類型
7800A0007內(nèi)存不足5002800A138A需要 Function 對(duì)象
9800A0009下標(biāo)超界5003800A138B不能給函數(shù)返回值賦值
10800A000A此數(shù)組被固定或臨時(shí)鎖定5004800A138C不能索引對(duì)象
11800A000B零除錯(cuò)誤5005800A138D需要 String
13800A000D類型失配5006800A138E需要 Date 對(duì)象
14800A000E串空間不足5007800A138F需要 Object 類型
17800A0011不能執(zhí)行所請(qǐng)求的操作5008800A1390非法賦值
28800A001C?臻g不足5009800A1391未定義標(biāo)識(shí)符
35800A0023子過程或函數(shù)未找到5010800A1392需要 Boolean
48800A0030裝載DLL出錯(cuò)5011800A1393不能執(zhí)行來自一個(gè)自由腳本的代碼
51800A0033內(nèi)部出錯(cuò)5012800A1394需要對(duì)象的成員
52800A0034壞文件名或數(shù)5013800A1395需要 VBArray
53800A0035文件未找到5014800A1396需要 JScript 對(duì)象
54800A0036壞文件模式5015800A1397需要 Enumerator 對(duì)象
55800A0037文件已經(jīng)打開5016800A1398需要正則表達(dá)式對(duì)象
57800A0039設(shè)備I/O錯(cuò)誤5017800A1399正則表達(dá)式語法錯(cuò)誤
58800A003A文件已經(jīng)存在5018800A139A未預(yù)期的限定符
61800A003D磁盤空間已滿5019800A139B正則表達(dá)式中缺少“]”
62800A003E輸入超出文件尾5020800A139C正則表達(dá)式中缺少“)”
67800A0043文件太多5021800A139D字符集范圍無效
68800A0044設(shè)備不可用5022800A139E異常拋出,但無法抓住
70800A0046權(quán)限禁用5023800A139F函數(shù)沒有合法的 Prototype (原型) 對(duì)象
71800A0047磁盤未準(zhǔn)備好5024800A13A0待解碼的 URI 包含有非法字符
74800A004A不能用不同的驅(qū)動(dòng)重命名5025800A13A1待解碼的 URI 編碼非法
75800A004B路徑/文件訪問錯(cuò)誤5026800A13A2小數(shù)部分的位數(shù)越界
76800A004C路徑未找到5027800A13A3精度越界
91800A005B對(duì)象變量或With塊變量未設(shè)置5028800A13A4需要 Array 或 arguments 對(duì)象
92800A005CFor循環(huán)未初始化5029800A13A5數(shù)組長度必須為一有限正整數(shù)
94800A005ENull使用無效5030800A13A6必須賦給數(shù)組長度一個(gè)有限正數(shù)
322800A0042不能建立所需的臨時(shí)文件
424800A01A8需要對(duì)象
429800A01A9Automation服務(wù)器不能建立對(duì)象
430800A01AE類不支持Automation
432800A01B0在Automation操作中找不到文件名或類名
438800A01B6對(duì)象不支持這個(gè)屬性或方法
440800A01B8Automation錯(cuò)誤
445800S01BD對(duì)象不支持這個(gè)動(dòng)作
446800A01BE對(duì)象不支持指定的參數(shù)
447800A01BF對(duì)象不支持當(dāng)前區(qū)域設(shè)置
448800A01C0指定的參數(shù)未找到
449800A01C1參數(shù)不可選
450800A01C2錯(cuò)誤的參數(shù)數(shù)目或非法屬性分配
451800A01C3對(duì)象不是一個(gè)集合
453800A01C5指定的dll函數(shù)未找到
458800A01CA變量使用了一個(gè)Jscript不支持的Automation類型
462800A01CE遠(yuǎn)程服務(wù)器機(jī)器不存在或不可用
501800A01F5不能分配給變量
502800A01F6對(duì)象對(duì)于腳本不安全
503800A01F7對(duì)象對(duì)于初始化不安全
504800A01F8對(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.toStringNumber.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.toStringString.prototype.valueOf 方法。這種調(diào)用的類型必須是 String 類型。

要改正此錯(cuò)誤

  • String 類型對(duì)象中只能調(diào)用 String.prototype.toStringString.prototype.valueOf 方法

需要 Date 對(duì)象

試圖對(duì)一個(gè)不是Date 類型的對(duì)象調(diào)用 Date.prototype.toStringDate.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.toStringObject.prototype.valueOf 方法。這種調(diào)用類型的對(duì)象必須是 Object 類型。

要改正此錯(cuò)誤

只調(diào)用Object Object.prototype.toStringObject.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.toStringBoolean.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.toStringRegExp.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 必須加以編碼?梢允褂 encodeURIencodeURIComponent 方法從一個(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;

相關(guān)軟件

相關(guān)文章

文章評(píng)論

軟件按字母排列: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z