การเข้าชมผลการปฏิบัติงานนั้นอาจเล็กน้อยมากดังที่อธิบายไว้ในคำตอบนี้นี้
ดังนั้นไปกับแนวคิดที่ว่าประสิทธิภาพไม่เป็นปัญหา คุณกำลังขว้างปาSystem.Exception
, เพียงเพื่อให้การดำเนินการย้ายเข้าไปในcatch
ข้อ การขว้าง a BadControlFlowThatShouldBeRewrittenException
อาจจะเกินความจริงไปหน่อย
มาทำลายมันกันเถอะ เรามี:
- วิธีการ
GetDataFromServer
(ชื่อวิธีควรจะ PascalCase ใน C #) bool
ซึ่งอาจจะสามารถโยนยกเว้นหรือผลตอบแทน
- หากผลเป็นวิ่ง
true
ProcessData
- กลับไปเป็น
null
อย่างอื่น
ดูเหมือนว่าวิธีการที่เขียนโค้ดนี้กำลังทำสิ่งต่าง ๆ มากเกินไป GetDataFromServer
กลับbool
ดูเหมือนว่าข้อบกพร่องการออกแบบผมจะคาดหวังว่าวิธีการที่จะส่งข้อมูลที่ได้รับจากเซิร์ฟเวอร์บางIEnumerable<SomeType>
ที่จะมี 0 รายการขึ้นไป - คือผลตอบแทนที่เส้นทางความสุขnรายการที่n> 0 , ไม่ให้มีความสุข เส้นทางส่งคืนสินค้า 0 รายการและเส้นทางที่ไม่มีความสุขจะระเบิดด้วยข้อยกเว้นที่ไม่สามารถจัดการได้ไม่ว่าจะเป็นอะไรก็ตาม
นั่นเปลี่ยนวิธีการที่ดูเหมือนมาก - อีกครั้งมันยากที่จะบอกว่าเรื่องนี้สมเหตุสมผลหรือไม่เนื่องจากโพสต์ดั้งเดิมมีจุดทางออกเพียงจุดเดียวเท่านั้น (และจะไม่คอมไพล์เนื่องจากเส้นทางโค้ดทั้งหมดจะคืนค่า ) นี่เป็นเพียงการคาดเดาป่า:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
ที่นี่คุณจะดูProcessData
และเห็นว่ามันซ้ำแล้วซ้ำresult
อีกและส่งคืนnull
หากไม่มีรายการในIEnumerable
ถ้ามีรายการที่ไม่มีใน
ตอนนี้ทำไมวิธีการกลับมาnull
? เซิร์ฟเวอร์ขัดข้อง มีข้อบกพร่องในแบบสอบถามหรือไม่ สายอักขระการเชื่อมต่อใช้ข้อมูลประจำตัวที่ไม่ถูกต้องหรือไม่ เมื่อใดก็ตามที่GetDataFromServer
ระเบิดด้วยข้อยกเว้นที่คุณไม่ได้คาดหวังคุณจะกลืนมันผลักลงใต้พรมและคืนnull
ค่า ฉันขอแนะนำให้ตรวจสอบข้อยกเว้นเฉพาะในกรณีนี้และบันทึกทุกอย่างอื่น การดีบั๊กจะง่ายขึ้นมาก
ด้วยcatch
ประโยคทั่วไปที่ไม่ได้รับการยกเว้นมันค่อนข้างยากที่จะวินิจฉัยอะไร ฉันจะทำอย่างน้อยที่สุดแทน:
catch(Exception e)
{
return null;
}
อย่างน้อยคุณก็สามารถทำลายและตรวจสอบe
ว่ามีอะไรผิดปกติหรือไม่
TL : DR : ไม่การขว้างและจับข้อยกเว้นสำหรับการควบคุมการไหลไม่ใช่ความคิดที่ดี