คำถามติดแท็ก throw

8
อะไรคือข้อแตกต่างระหว่าง“ โยนข้อผิดพลาดใหม่” และ“ โยนข้อผิดพลาดบางอย่าง”
ฉันต้องการที่จะเขียนตัวจัดการข้อผิดพลาดทั่วไปซึ่งจะจับข้อผิดพลาดที่กำหนดเองที่เกิดขึ้นกับจุดประสงค์ที่โค้ดใด ๆ เมื่อฉันไม่throw new Error('sample')ชอบในรหัสต่อไปนี้ try { throw new Error({'hehe':'haha'}); // throw new Error('hehe'); } catch(e) { alert(e); console.log(e); } เข้าสู่ระบบแสดงใน Firefox เป็นError: [object Object]และฉันไม่สามารถแยกวัตถุ สำหรับบันทึกที่สองthrowแสดงเป็น:Error: hehe ในขณะที่ฉันทำ try { throw ({'hehe':'haha'}); } catch(e) { alert(e); console.log(e); } คอนโซลแสดงเป็น: Object { hehe="haha"}ซึ่งฉันสามารถเข้าถึงคุณสมบัติข้อผิดพลาด อะไรคือความแตกต่าง? ความแตกต่างที่เห็นในรหัสคืออะไร? เช่นเดียวกับสตริงจะถูกส่งผ่านเป็นสตริงและวัตถุเป็นวัตถุ แต่ไวยากรณ์จะแตกต่างกันอย่างไร ฉันไม่ได้สำรวจวัตถุข้อผิดพลาดในการขว้างปา ... ฉันทำแค่โยนสาย มีวิธีอื่นนอกเหนือจากสองวิธีที่กล่าวมาข้างต้นหรือไม่?

6
ทำไมฉันถึงโยนเข้าไปในตัวจัดการ Promise.catch ไม่ได้?
เหตุใดฉันจึงไม่สามารถโยนการErrorเรียกกลับที่จับได้และปล่อยให้กระบวนการจัดการกับข้อผิดพลาดราวกับว่ามันอยู่ในขอบเขตอื่น ๆ ถ้าฉันไม่ทำconsole.log(err)อะไรจะถูกพิมพ์ออกมาและฉันก็ไม่รู้ว่าเกิดอะไรขึ้น กระบวนการก็จบลง ... ตัวอย่าง: function do1() { return new Promise(function(resolve, reject) { throw new Error('do1'); setTimeout(resolve, 1000) }); } function do2() { return new Promise(function(resolve, reject) { setTimeout(function() { reject(new Error('do2')); }, 1000) }); } do1().then(do2).catch(function(err) { //console.log(err.stack); // This is the only way to see the stack …

14
ฉันควรใช้ตัวระบุข้อยกเว้นใน C ++ หรือไม่
ใน C ++ คุณสามารถระบุว่าฟังก์ชันอาจมีหรือไม่มีข้อยกเว้นโดยใช้ตัวระบุข้อยกเว้น ตัวอย่างเช่น: void foo() throw(); // guaranteed not to throw an exception void bar() throw(int); // may throw an exception of type int void baz() throw(...); // may throw an exception of some unspecified type ฉันสงสัยเกี่ยวกับการใช้งานจริงเนื่องจากสิ่งต่อไปนี้: คอมไพเลอร์ไม่ได้บังคับใช้ตัวระบุข้อยกเว้นอย่างเข้มงวด แต่อย่างใดดังนั้นประโยชน์จึงไม่มาก ตามหลักการแล้วคุณต้องการรับข้อผิดพลาดในการคอมไพล์ หากฟังก์ชันละเมิดตัวระบุข้อยกเว้นฉันคิดว่าพฤติกรรมมาตรฐานคือการยุติโปรแกรม ใน VS.Net ถือว่าการโยน (X) เป็นการโยน (... ) …

4
ใน C ++ ถ้า throw คือนิพจน์ประเภทของมันคืออะไร?
ฉันเลือกสิ่งนี้ในการโจมตีสั้น ๆ ของฉันเพื่อ reddit: http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/ โดยทั่วไปผู้เขียนชี้ให้เห็นว่าใน C ++: throw "error" คือการแสดงออก นี่เป็นการสะกดที่ชัดเจนในมาตรฐาน C ++ ทั้งในข้อความหลักและไวยากรณ์ อย่างไรก็ตามสิ่งที่ไม่ชัดเจน (สำหรับฉันอย่างน้อยที่สุด) คือประเภทของนิพจน์คืออะไร? ฉันเดาว่า " void" แต่การทดลองเล็กน้อยกับ g ++ 4.4.0 และ Comeau ให้รหัสนี้: void f() { } struct S {}; int main() { int x = 1; const char * p1 = x == 1 …
115 c++  throw 

7
ข้อยกเว้นทำงานอย่างไร (เบื้องหลัง) ใน c ++
ฉันมักจะเห็นคนพูดว่าข้อยกเว้นนั้นช้า แต่ฉันไม่เคยเห็นข้อพิสูจน์ใด ๆ ดังนั้นแทนที่จะถามว่าพวกเขาเป็นอย่างไรฉันจะถามว่าข้อยกเว้นทำงานอย่างไรในเบื้องหลังดังนั้นฉันจึงสามารถตัดสินใจได้ว่าจะใช้เมื่อใดและจะช้าหรือไม่ จากสิ่งที่ฉันรู้ข้อยกเว้นจะเหมือนกับการส่งคืนหลายครั้งยกเว้นว่าจะตรวจสอบหลังจากการส่งคืนแต่ละครั้งว่าจำเป็นต้องทำอย่างอื่นหรือหยุด จะตรวจสอบได้อย่างไรว่าจะหยุดกลับเมื่อใด ฉันเดาว่ามีกองที่สองที่เก็บประเภทของข้อยกเว้นและตำแหน่งสแต็กจากนั้นจะส่งคืนจนกว่าจะถึงที่นั่น ฉันคาดเดาด้วยว่าครั้งเดียวที่สัมผัสกองที่สองนี้คือการโยนและในการลอง / จับแต่ละครั้ง AFAICT การใช้ลักษณะการทำงานที่คล้ายกันกับรหัสส่งคืนจะใช้เวลาเท่ากัน แต่ทั้งหมดนี้เป็นเพียงการคาดเดาดังนั้นฉันจึงอยากรู้ว่าเกิดอะไรขึ้น ข้อยกเว้นทำงานอย่างไร

3
ความแตกต่างระหว่าง C ++ 03 throw () specifier C ++ 11 noexcept
มีความแตกต่างระหว่าง throw()และnoexceptอื่น ๆ นอกเหนือจากการตรวจสอบที่รันไทม์และรวบรวมเวลาตามลำดับ? บทความ Wikipedia C ++ 11 นี้ชี้ให้เห็นว่าตัวระบุการโยน C ++ 03 เลิกใช้งานแล้ว เหตุใดจึงมีnoexceptความสามารถเพียงพอที่จะครอบคลุมทุกสิ่งในเวลาคอมไพล์ [หมายเหตุ: ฉันตรวจสอบคำถามนี้และบทความนี้แล้ว แต่ไม่สามารถระบุเหตุผลที่ชัดเจนในการเลิกใช้งานได้]
100 c++  exception  c++11  throw  noexcept 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.