ลองยกเว้นหยุดการดำเนินการบริการ

  List := FQueue.LockList;
  for I := 0 to List.Count - 1 do
  begin
    Mail := TIdMessageTaskman(List[I]);
    FEventLogger.LogMessage(  'Mail' + Mail.ToString, EVENTLOG_INFORMATION_TYPE , 0, 2);
    try
      try
        FidSmtp.Connect();
        FidSmtp.Send(Mail);
      except
        on e: exception do
        begin
          FEventLogger.LogMessage('Error sending mail  ' + e.ClassName + ', ' +
            e.Message, EVENTLOG_ERROR_TYPE, 0, 2);
          MarkMailExecution(Mail.TaskID, Mail.NotificationID, False, e.Message);
          Continue;
        end;
      end;
    finally
      begin
      if FidSmtp.Connected then
      FidSmtp.Disconnect;          
      end;
    end;
    FEventLogger.LogMessage(  'after finally', EVENTLOG_INFORMATION_TYPE , 0, 2);
    MarkMailExecution(Mail.TaskID, Mail.NotificationID, True, '');
    FreeAndNil(Mail)

ดังนั้นโค้ดต่อไปนี้จึงใช้งานได้ แต่ทันทีที่มีปัญหาในการส่งอีเมลและมีข้อยกเว้นเกิดขึ้น บริการจะหยุดลง มีวิธีที่ฉันสามารถทำให้มันดำเนินต่อไปและผ่านคิวทั้งหมดได้หรือไม่? แม้ว่าจะมีข้อความผิดพลาดก็ตาม ตัวอย่างข้อผิดพลาดที่ทำให้บริการของฉันหยุดทำงานคือเมื่อ "ฉันแนบ" ไฟล์ที่ไม่มีอยู่


person CiucaS    schedule 21.07.2015    source แหล่งที่มา
comment
ทำไมคุณถึงกลืนข้อยกเว้นทั้งหมด?   -  person David Heffernan    schedule 21.07.2015
comment
@DavidHeffernan ไม่แน่ใจว่าคุณหมายถึงอะไร ..   -  person CiucaS    schedule 21.07.2015
comment
en.m.wikipedia.org/wiki/Error_hiding   -  person David Heffernan    schedule 21.07.2015
comment
เนื่องจากมีโอกาสที่เมลบางอันจะมีปัญหาในการส่ง และพยายามไม่ล็อคการส่งเมลบางอัน เพราะส่ง 1 หรือ 2 ไม่ได้   -  person CiucaS    schedule 21.07.2015
comment
เหตุใดคุณจึงพบข้อยกเว้น ทั้งหมด   -  person David Heffernan    schedule 21.07.2015
comment
เพราะฉันไม่แน่ใจว่าอีเมลจะมีข้อยกเว้นอะไรบ้าง และฉันต้องเลี่ยงอีเมลใดอีเมลหนึ่ง คุณแนะนำให้ฉันทำอย่างไร   -  person CiucaS    schedule 21.07.2015
comment
ฉันขอแนะนำให้คุณดักจับเงื่อนไขข้อผิดพลาดเฉพาะเท่านั้น   -  person David Heffernan    schedule 21.07.2015
comment
ก่อนอื่น ฉันไม่แน่ใจว่าต้องทำอย่างไร และประการที่สอง นั่นอาจทำให้บริการของฉันหยุดชะงักได้ ฉันถูกไหม?   -  person CiucaS    schedule 21.07.2015
comment
ช่างเถอะ. หากคุณต้องการจัดการข้อยกเว้นโปเกมอนก็ขึ้นอยู่กับคุณ   -  person David Heffernan    schedule 21.07.2015
comment
สำหรับคำถามที่แท้จริงของคุณ คุณได้ทำการแก้ไขจุดบกพร่องอะไรบ้าง   -  person David Heffernan    schedule 21.07.2015
comment
มันยากสำหรับฉันที่จะดีบั๊กเนื่องจากเป็นบริการของ Windows สิ่งที่ฉันสามารถพูดได้ว่ามันส่งข้อยกเว้นแล้วเข้าสู่ในที่สุด แต่ไม่ได้เรียกใช้ FEventLogger.LogMessage( 'after ในที่สุด', EVENTLOG_INFORMATION_TYPE , 0, 2); เส้น   -  person CiucaS    schedule 21.07.2015
comment
บริการแก้ไขจุดบกพร่องนั้นยากกว่าอย่างแน่นอน คุณยังต้องทำมันอยู่ Stack Overflow ไม่สามารถทดแทนการดีบักได้ หากคุณยังไม่ได้ทำการดีบั๊กใดๆ คุณก็ไม่ควรถาม   -  person David Heffernan    schedule 21.07.2015
comment
ฉันรู้ว่าข้อผิดพลาดมาจากไหน ฉันรู้ว่าจะแก้ไขอย่างไร นั่นไม่ใช่ปัญหาของฉัน ปัญหาของฉันคือ ฉันไม่สามารถรู้ทุกข้อยกเว้นที่ Indy สามารถโยนออกไปได้ นั่นคือปัญหาที่แท้จริงของฉัน การจับข้อยกเว้นทั้งหมดและหลีกเลี่ยงมันด้วยวิธีใดวิธีหนึ่ง   -  person CiucaS    schedule 21.07.2015
comment
บางทีบล็อก finally อาจส่งข้อยกเว้น หรือแม้แต่ส่วน except   -  person kobik    schedule 21.07.2015
comment
@kobik มันไม่ใช่บล็อกสุดท้าย ในที่สุดฉันได้ดำเนินการตามขั้นตอนโดยไม่ได้ลองและมันก็ทำสิ่งเดียวกัน   -  person CiucaS    schedule 21.07.2015
comment
@CiucaS เหตุผลที่คุณไม่ควรดักจับข้อยกเว้น ทั้งหมด ก็คือข้อยกเว้นบางอย่างบ่งบอกถึงปัญหาที่ใหญ่กว่า เช่น. หากหน่วยความจำไม่เพียงพอ การละเมิดการเข้าถึง หรือข้อผิดพลาดทั่วไปของเครือข่ายเกิดขึ้น (เป็นต้น) เมลที่เหลือของคุณก็มักจะล้มเหลวเช่นกัน ในสถานการณ์กรณีที่เลวร้ายที่สุด ความพยายามของคุณที่จะยืนกรานในการพยายามส่งอีเมลอื่น ๆ อาจทำให้ส่วนอื่น ๆ ของแอปเสียหายหรือทำให้เกิดผลลัพธ์/ข้อความ/ข้อมูลที่ไม่ถูกต้อง คุณสามารถดักจับข้อยกเว้นเฉพาะเจาะจงได้อย่างง่ายดาย: เปลี่ยนตัวจัดการของคุณเป็น: on E: ESpecifcException do (คุณสามารถมีหลายรายการในบล็อก ยกเว้น)   -  person Disillusioned    schedule 21.07.2015


คำตอบ (1)


คุณบอกว่าคุณยืนยันว่าคุณได้เข้าสู่ส่วนสุดท้ายแล้ว มีความเป็นไปได้ 3 ทาง:

  1. บรรทัดโค้ดในส่วน สุดท้าย จะบล็อกโค้ดไม่ให้ดำเนินการต่อ

  2. มีข้อยกเว้นอีกประการหนึ่งเกิดขึ้นในส่วน สุดท้าย

  3. เมื่อคุณเข้าสู่ส่วน สุดท้าย แสดงว่าคุณอยู่ใน "สถานะข้อยกเว้น" แล้ว ดังนั้นการออกจาก ในที่สุด จะนำคุณไปยังส่วนถัดไปในที่สุด/ยกเว้นใน call stack

คุณจะต้องเพิ่มการบันทึกการดีบักเพื่อยืนยัน แต่ฉันสงสัยว่าหมายเลข 3 ทริกเกอร์ที่เป็นไปได้สำหรับสถานะข้อยกเว้นที่มีอยู่:

  • อินสแตนซ์ Mail ของคุณไม่ถูกต้อง และผู้กลืนของคุณตรวจพบการละเมิดการเข้าถึง เมื่อคุณพยายามใช้ Mail อีกครั้งในส่วน ยกเว้น คุณจะได้รับการละเมิดการเข้าถึงอีกครั้ง

  • บางสิ่งภายใน MarkMailExecution ทำให้เกิดข้อยกเว้นในตัวมันเอง

  • (ฉันเดาว่ากลไกการบันทึกของคุณไม่ได้ล้มเหลวเพราะคุณได้รับข้อมูลบางอย่างจากกลไกนี้)

person Disillusioned    schedule 21.07.2015
comment
คุณพูดถูก ฉันได้แสดงความคิดเห็นทุกอย่างแล้ว ยกเว้นและสุดท้ายยกเว้นข้อความบันทึก และบริการไม่หยุด ขอบคุณ! ฉันคิดว่าฉันสามารถแก้ปัญหาได้จากที่นี่ - person CiucaS; 21.07.2015