ソースを記入してください:グレープ市の公式サイト、ブドウ市は、開発者を有効にする開発者は、ソリューション、サービス、のための専門的な開発ツールを提供します。
オリジナルソースします。https://blog.bitsrc.io/types-of-native-errors-in-javascript-you-must-know-b8238d40e492
ブラウザのNode.jsを実行しているコンピュータ端末にコンソール、そしてどこからでも、私たちはエラーのすべての種類が表示されます。
この記事の焦点は、我々はJSの開発プロセスで発生する可能性があるエラーの種類を概説することです。
1.例外RangeError
デジタル値が許容範囲を超えた場合は、このエラーがスローされます。
たとえば、
1
2
3
|
const l = console.log
const arr = [90,88]
arr.length=90**99
|
我々は2つの要素を持つARRを持っています。次に、我々は、配列に含まれるようにしよう90**99 == 2.9512665430652753e+193
要素を。
この図は、成長することができ、配列の大きさの範囲を超えています。実行されているので、それは例外RangeErrorがスローされます。
1
2
3
4
5
|
$ node errors
errors.js:4
arr.length=90**99
^
RangeError: Invalid array length
|
私たちは、指定された範囲を超えてJS ARR配列の数を増やしたいので。
2.にReferenceError
参照変数/項目が破損しているか、存在しない場合、これはエラーにつながります。言い換えれば、変数/項目が存在しません。
たとえば、
1
2
3
4
5
|
const l=console.log
const cat =
"cat"
cat
dog
|
私たちは、変数持つ猫に初期化された「猫」。次に、我々はを参照してください猫の変数と犬の変数。猫の変数が存在し、犬のタグが存在しません。
猫が戻る「猫」、そして犬はつながる環境という名前のレコードがないので、にReferenceErrorを変数犬のは。
1
2
3
4
5
6
|
$ node errors
errors.js:3
dog
^
ReferenceError: dog is not defined
|
私たちが作成または変数を定義するたびに、変数名は、環境記録を書かれています。下に示すように、キーと値のストアテーブルとしてこの環境レコード:
1
2
3
4
5
|
+-------------+
| Key | Value |
---------------
| cat |
"cat"
|
+-------------+
|
我々は変数を参照するたびに変数は、それがプログラムメモリに定義されます。あなたは、環境のレコードの値を抽出し、戻り値を見つけた場合、それはキーワード検索レコードなどの環境変数の名前になります。定義されていない関数を呼び出します。
今、私たちが作成したりするときではない変数の割り当てを定義するとき。主要な変数として変数名は録音環境を書きますが、この値の遺骨は不定。
1
2
3
4
5
6
7
8
|
var
cat
env record
+-----------------+
| Key | Value |
-------------------
| cat | undefined |
+-----------------+
|
後で変数の値が代入された初期値が定義されていない場合、変数ENVでレコードの検索は、割り当てが上書きされます、発見されました。
1
2
3
4
5
6
7
8
9
|
var
cat
cat =
"cat"
env record
+-------------+
| Key | Value |
---------------
| cat |
"cat"
|
+-------------+
|
変数名はENVレコードで見つけることができない場合ので、JSエンジンはRefernceErrorをスローします。
1
2
3
4
5
6
7
|
+-------------+
| Key | Value |
---------------
| cat |
"cat"
|
+-------------+
cat
// "cat", yes, :) it's there
dog
// :( what's this? can't find it
|
注:それはちょうど、その値が設定されていない環境のレコードに存在する未定義変数は、にReferenceErrorをスローしません。
3.にSyntaxError
これは、我々が遭遇する最も一般的な間違いです。我々はJSエンジンはコードを理解することは困難であると入力すると、このエラーが発生します。構文解析時には、JSエンジンは、このエラーをキャッチ。
あなたは、端末上で結果を見ることができる前に、JSエンジンでは、我々のコードは、さまざまな段階を経ています。
- トークン化
- 解決
- 実行
各ユニットにトークン化ソースコード。この段階では、キーワード、デジタルになり、リテラル、演算子を分類し、個別にラベル付けされています。その後、得られたトークンストリームはパーサによって処理された解決フェーズに渡されます。ASTは、トークンから生成された場所です。ASTは、我々のコード構造の抽象データ構造です。
私たちは文法JSのコードの構文規則を満たしていない場合はトークン化では、これら二つの段階を解析し、実施段階では失敗とにSyntaxErrorがスローされます。たとえば、
1
2
|
const l = console.log
let
cat h =“ cat”
|
より多くのようにエンジンが発生します。この文字はでSyntaxErrorを投げるので、どこに「h」は、明らかに不必要です
1
2
3
4
5
6
|
$ node errors
errors.js:3
let
cat h =
"cat"
^
SyntaxError: Unexpected identifier
|
明らかに、Node.jsのエンジンは、猫が失敗した変数宣言が生じ、これによる文字の出現にエラー、不和を発見しました。
4.例外TypeError
TypeError 是指对象用来表示值的类型非预期类型时发生的错误。例如,我们期望它是布尔值,但结果发现它是string类型。
再例如:
1
2
|
const num = 123
num.toUpperCase()
|
这会引发TypeError
$ node errors
errors.js:4
num.toUpperCase()
^
TypeError: num.toUpperCase is not a function
因为toUpperCase函数需要字符串数据类型。toUpperCase函数是有意通用的;它不需要其this值是String对象。因此,可以将其转移到其他种类的对象中用作方法。
如果我们在Objects,Boolean,Symbol,null,undefined数据类型上调用toUpperCase函数,则只有字符串会转换为大写或小写形式,我们将得到TypeError,因为它操作的数据类型错误。
5. URIError
这说明了使用一种全局URI处理功能与其定义不兼容。
JS中的URI(统一资源指示符)具有以下功能:decodeURI,decodeURIComponent等。
如果我们用错误的参数调用其中任何一个,我们将得到一个URIError。
1
2
3
4
|
decodeURI(
"%"
)
^
URIError: URI malformed
|
encodeURI,获取URI的未编码版本。“%”不是正确的URI,因此引发了URIError。
编码或解码URI时出现问题时,将引发URIError。
6. EvalError
如果非法调用 eval(),则抛出 EvalError 异常。
根据EcmaSpec 2018版:
此异常不再会被JavaScript抛出,但是EvalError对象仍然保持兼容性。
7. InternalError
该错误在JS引擎内部发生,特别是当它有太多数据要处理并且堆栈增长超过其关键限制时。
当JS引擎被太多的递归,太多的切换情况等淹没时,就会发生这种情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
switch
(num) {
case
1:
...
break
case
2:
...
break
case
3:
...
break
case
4:
...
break
case
5:
...
break
case
6:
...
break
case
7:
...
break
... up to 1000 cases
}
|
太多的递归,一个简单的例子是这样的:
1
2
3
4
|
function
foo() {
foo()
}
foo()
|
结论
正如我们所说,没有人能不犯错误。就我们输入的代码而言,发生错误是难以避免的。不过为了避免更多的错误出现,我们需要知道抛出的错误的类型是什么,我们该如何解决。
所以我们在这篇文章中列出了它们,并提供了一些示例来简要的来介绍了它们是如何发生的。
最后,希望本文的一些浅见能为你写出更好的代码提供一些帮助,谢谢!