การใช้ข้อผิดพลาดอย่างเหมาะสม


155

ฉันใช้ TypeScript สำหรับโครงการขนาดใหญ่พอสมควรและฉันสงสัยว่ามาตรฐานสำหรับการใช้งานของErrors คืออะไร ตัวอย่างเช่นฉันส่งดัชนียกเว้นขอบเขตใน Java:

throw new IndexOutOfBoundsException();

คำสั่งที่เทียบเท่าใน TypeScript จะเป็น:

throw new Error("Index Out of Bounds");

ฉันสามารถทำสิ่งนี้ในวิธีอื่นได้อีก? มาตรฐานที่ยอมรับคืออะไร?

คำตอบ:


167

มีคนโพสต์ลิงค์นี้เพื่อ MDN ในความคิดเห็นและฉันคิดว่ามันเป็นประโยชน์มาก มันอธิบายสิ่งต่าง ๆ เช่น ErrorTypes อย่างละเอียด

EvalError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดที่เกิดขึ้นเกี่ยวกับฟังก์ชั่นระดับโลก eval ()

InternalError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดที่เกิดขึ้นเมื่อมีข้อผิดพลาดภายในในเอ็นจิน JavaScript ถูกส่งออกมา เช่น "การเรียกซ้ำมากเกินไป"

RangeError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดที่เกิดขึ้นเมื่อตัวแปรหรือพารามิเตอร์ที่อยู่นอกช่วงที่ถูกต้อง

ReferenceError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดที่เกิดขึ้นเมื่อไม่อ้างอิงการอ้างอิงที่ไม่ถูกต้อง

SyntaxError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดทางไวยากรณ์ที่เกิดขึ้นขณะแยกวิเคราะห์โค้ดใน eval ()

TypeError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดที่เกิดขึ้นเมื่อตัวแปรหรือพารามิเตอร์ไม่ใช่ประเภทที่ถูกต้อง

URIError --- สร้างอินสแตนซ์ที่แสดงถึงข้อผิดพลาดที่เกิดขึ้นเมื่อ encodeURI () หรือ decodeURI () ผ่านพารามิเตอร์ที่ไม่ถูกต้อง


มันดูเหมือนว่าจะหายไปประเภททั่วไปมากขึ้นสำหรับข้อโต้แย้งที่ไม่ถูกต้อง RangeErrorไม่ได้ข้อโต้แย้งที่ไม่ถูกต้องตกอยู่ภายใต้ คุณควรกำหนดประเภทที่กำหนดเองหรือเพียงแค่throw new Error("<message>");?
anddero

58

การประชุมสำหรับการออกจากช่วงใน JavaScript RangeErrorใช้ หากต้องการตรวจสอบประเภทการใช้งานถ้า / else + instanceofเริ่มต้นที่เฉพาะเจาะจงมากที่สุดกับสามัญที่สุด

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
เกิดข้อผิดพลาดทั่วไปอย่างไร และ / หรือที่ไหนรายการของสร้างขึ้นในชั้นเรียนข้อผิดพลาด JS?
pitosalas

7
มีรายการประเภทข้อผิดพลาด JavaScript และข้อมูลอื่น ๆ ที่ Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

6
@basarat ฉันคิดว่าคุณควรเพิ่มelse { throw; }ที่นี่
knocte

44

วิธีง่ายๆในการเปล่งและแสดงข้อความโดยข้อยกเว้น

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

ความระมัดระวัง

ข้างต้นไม่ใช่วิธีแก้ปัญหาหากเราไม่ทราบว่ามีข้อผิดพลาดชนิดใดที่สามารถปล่อยออกมาจากบล็อก ในกรณีเช่นนี้ควรใช้เครื่องป้องกันประเภทและการจัดการที่เหมาะสมสำหรับข้อผิดพลาดที่เหมาะสมควรทำ - ดูที่คำตอบ @Moriarty


ขอบคุณสำหรับตัวชี้ไปที่การแปลงประเภทอย่างชัดเจน ไม่พบข้อมูลใน typescript-Docs และเรียนรู้บางสิ่งบางอย่างในวันนี้
JackLeEmmerdeur

คุณรู้หรือไม่ว่าจุดประสงค์ของการเพิ่ม <Error> คืออะไร e.message ใช้งานได้ดีสำหรับฉัน
sbattou

1
@sbattou จุดประสงค์เพียงอย่างเดียวของการ<Error>บอกคอมไพเลอร์ TS ว่าeนี่คือประเภท<Error>เพื่อให้คุณมี (1) intellisense และ (2) การตรวจสอบประเภทที่ดีกว่า โปรดทราบว่านักแสดงใด ๆ ที่ไม่ได้แปลให้กับ JS เลยและเป็นน้ำตาลทรายที่บริสุทธิ์
Didii

25

อย่าลืมคำสั่ง switch:

  • มั่นใจในการจัดการกับ defaultตรวจสอบให้แน่ใจจัดการกับ
  • instanceof สามารถจับคู่กับซูเปอร์คลาส
  • ES6 constructorจะจับคู่กับคลาสที่แน่นอน
  • อ่านง่ายกว่า

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();


3
มันเยี่ยมมาก ดูเหมือนแข็งแกร่งและสะอาดกว่าคำตอบอื่น ๆ
Victor Zamanian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.