หนึ่ง. ผิดหมวดหมู่
1. ข้อผิดพลาดทางไวยากรณ์
หรือที่เรียกว่าข้อผิดพลาดในการแยกวิเคราะห์เกิดขึ้นเมื่อรวบรวมในภาษาการเขียนโปรแกรมแบบดั้งเดิมและเกิดขึ้นใน JavaScript เมื่อตีความ ข้อผิดพลาดเหล่านี้เกิดจากอักขระที่ไม่คาดคิดโดยตรงในรหัสและจากนั้นพวกเขาไม่สามารถรวบรวม/ตีความได้โดยตรง เช่นบรรทัดของรหัสขาดตัวยึดปิดส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์ เมื่อเกิดข้อผิดพลาดทางไวยากรณ์รหัสไม่สามารถดำเนินการได้ ใน JavaScript เฉพาะรหัสในเธรดเดียวกันจะได้รับผลกระทบจากข้อผิดพลาดทางไวยากรณ์ รหัสในเธรดอื่น ๆ และในไฟล์ที่อ้างอิงภายนอกอื่น ๆ สามารถดำเนินการต่อเพื่อดำเนินการต่อไปได้หากไม่ได้ขึ้นอยู่กับรหัสที่มีข้อผิดพลาด
2. ข้อผิดพลาดรันไทม์
หรือที่เรียกว่าข้อยกเว้น (ข้อยกเว้นหลังจากคอมไพล์/ล่าม) ณ จุดนี้ปัญหาไม่ได้อยู่ในไวยากรณ์ของรหัส แต่ในบางกรณีการดำเนินการที่พยายามทำให้เสร็จสมบูรณ์นั้นผิดกฎหมาย เช่น
window.openmyfile ();
เนื่องจากไม่มีวิธี OpenMyFile () เบราว์เซอร์จะส่งคืนข้อยกเว้น ข้อยกเว้นมีผลต่อเธรดที่เกิดขึ้นเท่านั้นและเธรด JavaScript อื่น ๆ สามารถดำเนินการต่อไปได้ตามปกติ
สอง. การจัดการข้อผิดพลาด
1. ฟังก์ชั่นการจัดการเหตุการณ์ OneERROR
มันเป็นกลไกแรกที่ช่วย JavaScript ในการจัดการข้อผิดพลาด เมื่อมีข้อยกเว้นเกิดขึ้นในหน้าเหตุการณ์ข้อผิดพลาดจะถูกยิงบนวัตถุหน้าต่าง เช่น
การคัดลอกรหัสมีดังนี้:
<html>
<head>
<title> ตัวอย่าง onerror </title>
<script type = "text/javascript">
window.onerror = function () {
การแจ้งเตือน ("เกิดข้อผิดพลาด!");
-
</script>
</head>
<body onload = "function1 ()">
</body>
</html>
ในรหัสด้านบนพยายามเรียกใช้ฟังก์ชันที่ไม่มีอยู่จริงในขณะที่โหลดหน้าเว็บจะมีการยกข้อยกเว้น ข้อความแสดงข้อผิดพลาดที่ "เกิดข้อผิดพลาด" ปรากฏขึ้น อย่างไรก็ตามข้อความแสดงข้อผิดพลาดของเบราว์เซอร์จะปรากฏขึ้นเช่นกัน จะซ่อนมันไว้ในเบราว์เซอร์ได้อย่างไร? เพียงส่งคืนวิธีการที่แท้จริง
การคัดลอกรหัสมีดังนี้:
<script type = "text/javascript">
window.onerror = function () {
การแจ้งเตือน ("เกิดข้อผิดพลาด!");
กลับมาจริง;
-
</script>
1) ลบข้อความแสดงข้อผิดพลาด
ตัวจัดการ ONERROR ให้ข้อมูลสามประเภทเพื่อกำหนดลักษณะที่แน่นอนของข้อผิดพลาด:
i) ข้อความแสดงข้อผิดพลาด - สำหรับข้อผิดพลาดที่กำหนดเบราว์เซอร์จะแสดงข้อมูลเดียวกัน
ii) URL - ในไฟล์ที่เกิดข้อผิดพลาด;
หมายเลขบรรทัด - หมายเลขบรรทัดที่เกิดข้อผิดพลาดใน URL ที่กำหนด
ดูตัวอย่างต่อไปนี้สำหรับวิธีการเข้าถึง:
การคัดลอกรหัสมีดังนี้:
<script type = "text/javascript">
window.onerror = ฟังก์ชั่น (smessage, surl, sline) {
การแจ้งเตือน ("เกิดข้อผิดพลาด!/n" + smessage + "/nurl:" + surl + "/nline หมายเลข:" + sline);
กลับมาจริง;
-
</script>
2) ข้อผิดพลาดในการโหลดภาพ
วัตถุหน้าต่างไม่ได้เป็นวัตถุเดียวที่รองรับฟังก์ชั่นการจัดการเหตุการณ์ ONERROR แต่ยังให้การสนับสนุนสำหรับวัตถุภาพ เมื่อไม่สามารถโหลดภาพได้สำเร็จเนื่องจากการไม่มีอยู่ของไฟล์เหตุการณ์ข้อผิดพลาดจะถูกทริกเกอร์บนภาพ ลองดูตัวอย่าง:
<img src =” amigo.jpg” oneerror =” การแจ้งเตือน ('เกิดข้อผิดพลาดในขณะที่โหลดภาพ') "/>
ตัวอย่างข้างต้นจัดสรรฟังก์ชั่นตัวจัดการเหตุการณ์ ONERROR โดยตรงใน HTML แน่นอนคุณยังสามารถจัดสรรฟังก์ชั่นการประมวลผลเหตุการณ์ผ่านสคริปต์ ก่อนที่จะตั้งค่าคุณสมบัติ SRC ของภาพคุณต้องรอให้โหลดหน้าเว็บเต็ม รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
<html>
<head>
<title> การทดสอบข้อผิดพลาดของภาพ </title>
<script type = "text/javascript">
ฟังก์ชั่น handleload () {
document.images [0] .onerror = function () {
การแจ้งเตือน ("เกิดข้อผิดพลาดขณะโหลดรูปภาพ!");
-
document.images [0] .src = "amigo.jpg";
-
</script>
</head>
<body onload = "handleload ()">
<img/>
<body>
</html>
หมายเหตุ: แตกต่างจากฟังก์ชั่นตัวจัดการเหตุการณ์ onerror ของวัตถุหน้าต่างเหตุการณ์ onerror ของภาพมีพารามิเตอร์ข้อมูลเพิ่มเติมใด ๆ
3) จัดการข้อผิดพลาดทางไวยากรณ์
Onerror ยังสามารถจัดการกับข้อผิดพลาดทางไวยากรณ์ แต่สิ่งหนึ่งจะต้องสังเกตว่าตัวจัดการเหตุการณ์จะต้องเป็นรหัสแรกที่ปรากฏบนหน้าเพราะหากเกิดข้อผิดพลาดทางไวยากรณ์ก่อนที่จะตั้งค่าตัวจัดการเหตุการณ์ตัวจัดการเหตุการณ์จะไร้ประโยชน์
หมายเหตุ: ข้อผิดพลาดทางไวยากรณ์จะหยุดการดำเนินการรหัสอย่างสมบูรณ์
หมายเหตุ: ปัญหาหลักของการใช้ตัวจัดการเหตุการณ์ onerror คือมันเป็นส่วนหนึ่งของ BOM ดังนั้นจึงไม่มีมาตรฐานใดที่สามารถควบคุมพฤติกรรมของมันได้ ดังนั้นเบราว์เซอร์ที่แตกต่างกันจึงใช้เหตุการณ์นี้เพื่อจัดการกับข้อผิดพลาดอย่างมีนัยสำคัญ เช่น เมื่อเหตุการณ์ข้อผิดพลาดเกิดขึ้นใน IE รหัสปกติจะดำเนินการต่อไปตัวแปรและข้อมูลทั้งหมดจะถูกเก็บรักษาไว้และสามารถเข้าถึงได้ผ่านฟังก์ชั่นตัวจัดการเหตุการณ์ ONERROR ใน Mozilla การดำเนินการรหัสปกติจะสิ้นสุดลงและตัวแปรและข้อมูลทั้งหมดก่อนที่ข้อผิดพลาดจะถูกทำลาย
2. ลอง…จับคำสั่ง
ECMPScript ฉบับที่สามแนะนำคำสั่งลอง ... เช่น
การคัดลอกรหัสมีดังนี้:
พยายาม {
window.openfile1 ();
การแจ้งเตือน ("ประสบความสำเร็จเรียกว่าวิธี OpenFile1");
} catch (ข้อยกเว้น) {
การแจ้งเตือน ("ข้อยกเว้นเกิดขึ้น!");
} ในที่สุด {
การแจ้งเตือน ("ลอง .. การทดสอบจบลง!");
-
ซึ่งแตกต่างจาก Java มาตรฐาน ECMASCRIPT สามารถมีคำสั่งจับเดียวในคำสั่งลอง ... Catch เนื่องจาก JavaScript เป็นภาษาประเภทที่อ่อนแอและไม่สามารถระบุประเภทของข้อยกเว้นเฉพาะในประโยคจับได้ โดยไม่คำนึงถึงประเภทของข้อผิดพลาดมันจะถูกจัดการโดยคำสั่งจับเดียวกัน อย่างไรก็ตาม Mozilla ได้ขยายและสามารถเพิ่มคำสั่งจับหลายรายการซึ่งไม่แนะนำให้ใช้วิธีนี้
ในที่สุดก็ใช้เพื่อรวมรหัสที่จะดำเนินการโดยไม่คำนึงว่ามีข้อยกเว้นเกิดขึ้นหรือไม่ซึ่งมีประโยชน์สำหรับการปิดลิงค์เปิดและทรัพยากรการปลดปล่อย
1) ซ้อนกันลอง…จับคำสั่ง
ใช้เพื่อจัดการกับปัญหาข้อผิดพลาดในข้อจับจับลองดูตัวอย่างรหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
พยายาม {
eval ("A ++ B");
} catch (oexception) {
การแจ้งเตือน ("เกิดข้อผิดพลาด!");
พยายาม {
var aerror = อาร์เรย์ใหม่ (1000000000000000000000000000000000000000000000000000000000000000000000000000);
} catch (ข้อยกเว้น) {
การแจ้งเตือน ("เกิดข้อผิดพลาดในประโยคจับ!");
-
} ในที่สุด{
การแจ้งเตือน ("เสร็จสมบูรณ์")
-
2) วัตถุข้อผิดพลาด
เมื่อเกิดข้อผิดพลาด JavaScript มีคลาสฐานข้อผิดพลาดสำหรับการขว้าง มันมีสองลักษณะ:
i) ชื่อ - สตริงที่แสดงถึงประเภทที่ไม่ถูกต้อง
ii) ข้อความ - ข้อความแสดงข้อผิดพลาดจริง
ชื่อของวัตถุข้อผิดพลาดสอดคล้องกับคลาสและสามารถเป็นหนึ่งในค่าต่อไปนี้:
EverError: ข้อผิดพลาดเกิดขึ้นในฟังก์ชัน eval ();
Rangeerror: ค่าตัวเลขเกินช่วงที่ JavaScript สามารถเป็นตัวแทน;
ReferenceRoror: ใช้การอ้างอิงที่ผิดกฎหมาย;
SyntaxError: ข้อผิดพลาดทางไวยากรณ์เกิดขึ้นในการเรียกฟังก์ชั่น eval () และข้อผิดพลาดอื่น ๆ ได้รับการรายงานโดยเบราว์เซอร์และไม่สามารถประมวลผลได้ผ่านการลอง ... จับ;
TypeError: ประเภทของตัวแปรไม่ใช่สิ่งที่คาดว่าจะต้องใช้
UrierRor: เกิดข้อผิดพลาดในฟังก์ชัน ENCODEURI หรือ DECODEURI
3) กำหนดประเภทข้อผิดพลาด
สองวิธีต่อไปนี้สามารถใช้เพื่อกำหนดประเภทข้อผิดพลาด วิธีแรกขึ้นอยู่กับแอตทริบิวต์ชื่อของข้อยกเว้นดังนี้:
การคัดลอกรหัสมีดังนี้:
พยายาม {
eval ("A ++ B");
} catch (oexception) {
if (oException.name = "SyntaxError") {
การแจ้งเตือน ("SyntaxError เกิดขึ้น!");
} อื่น {
การแจ้งเตือน ("เกิดข้อผิดพลาดอื่น ๆ !");
-
-
อินสแตนซ์ของตัวดำเนินการใช้ในวินาทีและรหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
พยายาม {
eval ("A ++ B");
} catch (oexception) {
ถ้า (อินสแตนซ์ oexception ของ syntaxError) {
การแจ้งเตือน ("SyntaxError เกิดขึ้น!");
} อื่น {
การแจ้งเตือน ("เกิดข้อผิดพลาดอื่น ๆ !");
-
-
4) คำสั่งโยนข้อยกเว้น
ใน ECMASCRIPT ฉบับที่สามมันถูกใช้เพื่อโยนข้อยกเว้นอย่างตั้งใจ วัตถุข้อผิดพลาดที่ถูกโยนอาจเป็นสตริงตัวเลขค่าบูลีนหรือวัตถุจริงหรือวัตถุข้อผิดพลาด (ตัวสร้างของมันมีเพียงฟังก์ชั่นเดียวนั่นคือข้อความแสดงข้อผิดพลาด) EG1. โยนข้อผิดพลาดใหม่ ("เกิดข้อผิดพลาด!");
EG2.
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น addtwonumber (a, b) {
if (arguments.length <2) {
โยนข้อผิดพลาดใหม่ ("ต้องส่งตัวเลขสองตัว!");
-
-
พยายาม {
ผลลัพธ์ = addTwonumber (90);
} catch (oexception) {
ถ้า (อินสแตนซ์ oexception ของ syntaxError) {
การแจ้งเตือน ("syntaxError:" + oexception.message);
} อื่นถ้า (ข้อผิดพลาดของ Oexception Instanceof) {
การแจ้งเตือน (oexception.message);
-
-
ข้างต้นเป็นเนื้อหาทั้งหมดที่อธิบายไว้ในบทความนี้ ฉันหวังว่าคุณจะชอบมัน