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

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

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

這篇文章主要提供給大家分享學(xué)習(xí)的是關(guān)于JScript運(yùn)行時錯誤的簡單分析,希望對大家有用。

JScript 運(yùn)行時錯誤是指當(dāng) JScript 腳本試圖執(zhí)行一個系統(tǒng)不能運(yùn)行的動作時導(dǎo)致的錯誤。當(dāng)正在運(yùn)行腳本、計(jì)算變量表達(dá)式、或者正在動態(tài)分配內(nèi)存時出現(xiàn) JScript 運(yùn)行時錯誤時。

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

試圖給 this 賦值,this 是 JScript 關(guān)鍵字,表示:

  • 當(dāng)前正在執(zhí)行某個方法的對象,
  • 如果沒有當(dāng)前方法(或該方法不屬于任何其它對象),則是指全局對象。

所謂方法就是由對象調(diào)用的 JScript 函數(shù)。在一個方法內(nèi), this 關(guān)鍵字代表調(diào)用該方法的對象的引用(這種情況下,就是指使用 new 操作符調(diào)用類構(gòu)造函數(shù)所創(chuàng)建的對象)。

在一個方法內(nèi)可以使用 this 來引用當(dāng)前對象,但不能對其賦予新的值。

要改正此錯誤

  • 不要試圖對 this 賦值。要訪問某個實(shí)例化對象的屬性或方法,請使用點(diǎn)操作符(例如 circle.radius)。

注意 不能將用戶創(chuàng)建的變量命名為 this;這是一個 JScript 保留字。


需要 Number 類型

試圖對一個不是Number 類型的對象調(diào)用 Number.prototype.toStringNumber.prototype.valueOf 方法。這種調(diào)用類型的對象必須是Number 類型。

要改正此錯誤

只調(diào)用Number Number.prototype.toString or Number.prototype.valueOf 方法。


需要 Function 對象

試圖對一個不是 Function 對象調(diào)用 Function prototype 方法,或者在函數(shù)調(diào)用上下文中使用了對象。例如,下面的代碼將產(chǎn)生該錯誤,因?yàn)?foo 不是一個函數(shù)。

var foo = new Object();  // 創(chuàng)建一個稱為 "foo" 的新對象。  var x = foo();  // 試圖將 foo 作為一個函數(shù)加以調(diào)用。

要改正此錯誤

  • 只對 Function 對象調(diào)用 Function prototype 方法。
  • 確保只使用函數(shù)調(diào)用操作符() 來調(diào)用函數(shù)。

不能給函數(shù)返回值賦

試圖將一個值賦給函數(shù)結(jié)果?梢詫⒑瘮(shù)結(jié)果賦給某個變量,但其本身不能用作變量。如果希望將一個新值賦給該函數(shù)本身,則不要圓括號(函數(shù)調(diào)用操作符)。下面的示例演示了產(chǎn)生這一錯誤的情形。

myFunction() = 42;  // 試圖強(qiáng)將 42 賦給該函數(shù)調(diào)用的結(jié)果。

要改正此錯誤

  • 不要使用函數(shù)調(diào)用的值作為賦值對象?梢詫⒑瘮(shù)調(diào)用的結(jié)果賦給某個變量
myVar = myFunction(42);
  • 或者,可以將函數(shù)本身(不是其返回?cái)?shù)值)賦給一個變量。
myFunction = new Function("return 42;");

需要 String

試圖對String對象類型之外的其他類型對象調(diào)用String.prototype.toStringString.prototype.valueOf 方法。這種調(diào)用的類型必須是 String 類型。

要改正此錯誤

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

需要 Date 對象

試圖對一個不是Date 類型的對象調(diào)用 Date.prototype.toStringDate.prototype.valueOf 方法。這種調(diào)用類型的對象必須是 Date 類型。例如:

var o = new Object;  o.f = Date.prototype.toString;  o.f();

要改正此錯誤

  • 只能對Date 類型的對象調(diào)用 Date.prototype.toString 或者 Date.prototype.valueOf 方法。

需要 Object 類型

試圖對一個不是Object 類型的對象調(diào)用 Object.prototype.toStringObject.prototype.valueOf 方法。這種調(diào)用類型的對象必須是 Object 類型。

要改正此錯誤

只調(diào)用Object Object.prototype.toStringObject.prototype.valueOf 方法。


非法賦值

試圖對一個只讀的標(biāo)識符賦值。不能對只讀的標(biāo)識符賦值。例如,主機(jī)定義對象和外部 COM 對象。

要改正此錯誤

  • 不要賦值給只讀標(biāo)識符。

未定義標(biāo)識符

JScript 編譯器不認(rèn)識試圖使用的標(biāo)識符。當(dāng)出現(xiàn)下述情況時,返回未定義值:

  • 不存在的變量
  • 變量已聲明,但從未對其賦值
  • 對象屬性不存在。

要改正此錯誤

  • var 語句聲明一個變量(如 var x)。

需要 Boolean

試圖用一個不是 Boolean 類型的對象來調(diào)用 Boolean.prototype.toString 或者 Boolean.prototype.valueOf 方法。這種調(diào)用類型的對象必須是 Boolean 類型。例如:

var o = new Object;  o.f = Boolean.prototype.toString;  o.f();

要改正此錯誤

  • 只使用 Boolean 類型的對象調(diào)用 Boolean.prototype.toStringBoolean.prototype.valueOf 方法。

需要對象的成員

試圖對某個對象的數(shù)據(jù)成員執(zhí)行某個操作,但該成員不存在。

要改正此錯誤

  • 請確保所輸入的數(shù)據(jù)成員名字是正確的。

需要 VBArray

所提供的對象不是所需要的 Visual Basic 中的 safeArray。

new VBArray(safeArray);

VBArrays 是只讀的,且不能直接被創(chuàng)建。safeArray 參數(shù)為一個 VBArray 值,并且在被傳遞給 VBArray構(gòu)造函數(shù)之前必須獲得一個 VBArray 值。這個值只能通過檢索現(xiàn)有的 ActiveX 或其他對象得到。

要改正此錯誤

  • 請確保只將 VBArray 對象傳遞給 VBArray 構(gòu)造函數(shù)。

需要 JScript 對象型

試圖將一個非-JScript 對象傳給需要 JScript對象的內(nèi)置函數(shù)。各種內(nèi)置函數(shù)都需要在 JScript 中定義的對象(與主機(jī)定義的對象和控件之類的外部組件相對)。

要改正此錯誤

  • 請確保正在作為參數(shù)傳遞的對象具有正確的類型。

需要 Enumerator 對象

試圖對一個非 Enumerator 類型的對象調(diào)用 Enumerator.prototype.atEnd、 Enumerator.prototype.item、 Enumerator.prototype.moveFirst 或者 Enumerator.prototype.moveNext 方法。這種調(diào)用類型的對象必須是 Enumerator 類型。下面是違反這個規(guī)則的代碼示例:

var o = new Object;  o.f = Enumerator.prototype.atEnd;  o.f();

要改正此錯誤

  • 只能對Enumerator 類型的對象調(diào)用其 Enumerator.prototype.atEnd、Enumerator.prototype.item、Enumerator.prototype.moveFirst 或者 Enumerator.prototype.moveNext 方法。要查找某個對象是否為 Enumerator 對象,請使用:
    if(x instanceof Enumerator)

需要正則表達(dá)式對象

試圖對RegExp類型對象之外的其他對象調(diào)用 RegExp.prototype.toString RegExp.prototype.valueOf方法。這種調(diào)用的類型必須是 RegExp 對象。

要改正此錯誤

  • RegExp 對象類型 中,只能調(diào)用RegExp.prototype.toStringRegExp.prototype.valueOf 方法

正則表達(dá)式語法錯誤

查找字符串的結(jié)構(gòu)違反了一條或多條關(guān)于 JScript 正則表達(dá)式的語法規(guī)則。

要改正此錯誤

  • 確保正則表達(dá)式查找字符串的結(jié)構(gòu)與 JScript 正則字符串的語法一致。

未預(yù)期的限定符

在組織正則表達(dá)式的查找模式時,創(chuàng)建了一個帶有非法循環(huán)因子的模式元素。例如,模式

    /^+/    

是非法的,因?yàn)樵?^(輸入開始)沒有循環(huán)因子。下表列出了沒有循環(huán)因子的元素:

元素描述
^輸入開始
$輸入結(jié)束
\b詞的邊界
\B非單詞的邊界
*零個或多個循環(huán)
+零個或多個循環(huán)
?零個或多個循環(huán)
{n}n 循環(huán)
{n,}n 或多個循環(huán)
{n,m}從 n 到 m 循環(huán),包括 m

要改正此錯誤

  • 請確保查找模式元素僅包括合法的循環(huán)因子。

正則表達(dá)式中缺少 ']'

試圖創(chuàng)建一個用于正則表達(dá)式匹配的字符類,但是沒有右中括號。單個的文字字符組合可以用括號括起來表示一個字符類。一個字符類可以匹配其中包含的任一字符。例如,/[abc]/ 可以匹配字母 “a”, “b”, 或 “c” 的任何一個。

要改正此錯誤

  • 給正則表達(dá)式加上右中括號。

注意 如果想匹配單中括號,可以使用反斜杠將其轉(zhuǎn)義 - \( - 這樣就不會被JScript 解釋為特殊字符。)


正則表達(dá)式中缺少 ')'

試圖創(chuàng)建一個正則表達(dá)式捕獲、斷言和組合,但不包括結(jié)束圓括號。正則表達(dá)式中的圓括號有多個用途。首先,它們主要用來抓捕子表達(dá)式,指定斷言、或?qū)⒛J浇M合,從而通過 *、+、? 等等使這些項(xiàng)被看作一個單一的單位。

要改正此錯誤

  • 加上最右邊的結(jié)束圓括號。

注意 如果想匹配單括號,可以使用反斜杠將其轉(zhuǎn)義 - \( - 這樣就不會被 JScript 解釋為特殊字符。)


字符集范圍無效

試圖創(chuàng)建的正則表達(dá)式含有無效的字符集范圍。字符集的范圍必須只能是單個字符的變化,諸如a-z 或 0-9;不能在字符集中包括諸如 \w 的字符類。字符集范圍的第一個字符也必須位于范圍中第二個字符的前面。例如:

var good = /[a-z]/;  // 有效的字符范圍 - a 在 z 之前。  var notGood = /[z-a]/;  // 無效的字符范圍 - z 不在 a 之前。

要改正此錯誤

  • 只使用單字符來組合正則表達(dá)式字符集,并確保他們具有正確的順序。

異常拋出,但無法抓住

在代碼中包括了一條 throw 語句,但沒有將其包含在某個 try 語句塊內(nèi),或者沒有相關(guān)的 catch 語句塊來捕獲錯誤。異常是在 try 語句塊中使用 throw 語句被拋出,并且應(yīng)該由 try 語句塊外的 catch 語句抓住。

要改正此錯誤

  • try 語句塊將可能產(chǎn)生異常的代碼封住,并確保外面有一個相應(yīng)的 catch 語句塊。
  • 確認(rèn) catch 語句中為正確的異常格式。
  • 如果異常被再次拋出,確認(rèn)存在相應(yīng)的 catch 語句。

函數(shù)沒有合法的 prototype 對象

試圖使用 instanceof 來確定一個對象是否是從某個特定函數(shù)類派生而來,但重新定義的該對象的prototype 屬性要么是空的,要么是外部對象類型(都不是有效的JScript 對象)。外部對象可能來自主機(jī)對象模型(例如, Internet Explorer 的產(chǎn)品和 window 產(chǎn)品,或一個外部的COM 對象)。

要改正此錯誤

  • 確保函數(shù)的 prototype 屬性引用了合法的 JScript。

待編碼的 URI 包含有非法字符

試圖將字符串編碼得到 URI(通用資源標(biāo)識符),但是包含非法字符。盡管字符串中的絕大多數(shù)字符都是合法的,可以轉(zhuǎn)換為 URI,但有些 Unicode 字符序列是非法的。

要改正此錯誤

請確保待編碼的字符串只包含合法的 Unicode 序列。

一個完整的 URI 是由一系列部件和分隔符組成的。其通用格式為:

<Scheme>:<first>/<second>;<third>?<fourth>

尖括號內(nèi)的名稱代表部件,而 “:”, “/”, “;” 和 “?” 都是作為分隔符的保留字。


待解碼 URI 的編碼非法

試圖對一個不正確 URI(通用資源標(biāo)識符)進(jìn)行解碼。URI 具有特殊的語法;絕大多數(shù)非字母數(shù)字字符在用于 URI 必須加以編碼?梢允褂 encodeURIencodeURIComponent 方法從一個標(biāo)準(zhǔn)的 JScript 字符串創(chuàng)建一個 URI。

一個完整的 URI 是由一系列部件和分隔符組成的。其通用格式為:

<Scheme>:<first>/<second>;<third>?<fourth>

尖括號內(nèi)的名稱代表部件,而 “:”, “/”, “;” 和 “?” 都是作為分隔符的保留字。

要改正此錯誤

  • 請確保您只需要對合法的 URI 進(jìn)行解碼。你不能對標(biāo)準(zhǔn)的 JScript 字符串解碼,因?yàn)樗鼈兛赡芎蟹欠ㄗ址?

小數(shù)部分的位數(shù)越界

試圖將一個非法參數(shù)傳遞給Number.prototype.toExponential()。函數(shù)toExponential() 的參數(shù)為 0 到 20(含 20)之間。

要改正此錯誤

  • 請確保的 toExponential() 不是太大也不是太小。

精度越界

試圖將一個非法參數(shù)傳遞給 Number.prototype.toPrecision。 給 toPrecision 的參數(shù)必須為 1 到 21(含21)之間。

要改正此錯誤

  • 請確保 toPrecision 不是太大也不是太小。

需要 Array 或 arguments 對象

沒有將數(shù)組作為參數(shù)。這個錯誤只在 Function.prototype.apply方法中發(fā)生。如果使用這個函數(shù),則該函數(shù)的第二個參數(shù)要么是 Array 對象,要么是 Arguments 對象。

要改正此錯誤

  • 指定一個 Array 或 Arguments 對象作為第二個參數(shù)。

數(shù)組長度必須是一個有限正整數(shù)

在調(diào)用 Array 構(gòu)造函數(shù)時使用的參數(shù)不是自然數(shù)(所謂自然數(shù)就是零加上正整數(shù)集合)。

要改正此錯誤

在創(chuàng)建一個新的 Array 對象時只能使用正整數(shù)。如果要創(chuàng)建一個只有一個元素且不是整數(shù)的數(shù)組,請執(zhí)行下面兩步操作。首先,創(chuàng)建一個只有一個元素的數(shù)組,然后將這個值賦給第一個元素 (array[0])。下面的示例將產(chǎn)生這個錯誤。

var piArray = new Array(3.14159);

下面的示例演示了指定一個只有單個數(shù)值元素的數(shù)組的正確方法。

var piArray = new Array(1);  piArray [0] = 3.14159;

數(shù)組大小沒有上界限制,但不能超過整數(shù)的最大值(大約為40億)。


必須賦給數(shù)組長度一個有限正整數(shù)

在對現(xiàn)有 Array 對象設(shè)置其 length 屬性時,所指定的數(shù)組長度不是正整數(shù),也不是零。如果給某個 Array 對象的 length 屬性所賦的值時為負(fù)數(shù)或不是數(shù)值 (NaN) 時,就會產(chǎn)生這個錯誤。請注意 JScript 會自動將小數(shù)數(shù)值轉(zhuǎn)換為整數(shù)。

要改正此錯誤

將一個正整數(shù)賦給 length 屬性。數(shù)組大小沒有上界限制,但不能超過整數(shù)的最大值(大約為40億)。下面的示例演示了給 Array 對象的 length 屬性賦值的正確方法。

var my_array = new Array();  my_array.length = 99;

相關(guān)軟件

相關(guān)文章

文章評論

軟件按字母排列: 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