Coba kecuali hentikan eksekusi layanan

  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)

Jadi kode berikut berfungsi, tetapi segera setelah ada masalah dalam pengiriman email dan pengecualian muncul, layanan berhenti. Adakah cara agar saya dapat melanjutkannya dan melewati semua Antrean? Meskipun ada pesan yang error. Contoh error yang menghentikan layanan saya adalah ketika "Saya melampirkan" file yang tidak ada.


person CiucaS    schedule 21.07.2015    source sumber
comment
Mengapa Anda menelan semua pengecualian?   -  person David Heffernan    schedule 21.07.2015
comment
@DavidHeffernan tidak yakin apa yang Anda maksud..   -  person CiucaS    schedule 21.07.2015
comment
en.m.wikipedia.org/wiki/Error_hiding   -  person David Heffernan    schedule 21.07.2015
comment
Karena ada kemungkinan beberapa email saya mengalami masalah saat pengiriman dan saya berusaha untuk tidak mengunci pengiriman beberapa email, karena 1 atau 2 tidak dapat terkirim.   -  person CiucaS    schedule 21.07.2015
comment
Mengapa Anda menangkap semua pengecualian?   -  person David Heffernan    schedule 21.07.2015
comment
Ya, karena saya tidak yakin pengecualian apa yang akan muncul di email tersebut dan saya harus mengabaikan salah satu dari pengecualian tersebut, menurut Anda apa yang akan saya lakukan?   -  person CiucaS    schedule 21.07.2015
comment
Saya sarankan Anda hanya menjebak kondisi kesalahan tertentu   -  person David Heffernan    schedule 21.07.2015
comment
Pertama-tama, saya tidak yakin bagaimana melakukan itu dan kedua, itu akan memblokir layanan saya di beberapa titik. Apakah saya benar?   -  person CiucaS    schedule 21.07.2015
comment
Sudahlah. Jika Anda lebih suka melakukan penanganan pengecualian Pokemon, itu terserah Anda.   -  person David Heffernan    schedule 21.07.2015
comment
Adapun pertanyaan Anda yang sebenarnya, debugging apa yang telah Anda lakukan?   -  person David Heffernan    schedule 21.07.2015
comment
Sulit bagi saya untuk men-debugnya karena ini adalah Layanan Windows. Apa yang bisa saya katakan itu memunculkan pengecualian dan kemudian masuk ke akhirnya, tetapi tidak menjalankan FEventLogger.LogMessage( 'afterfinally', EVENTLOG_INFORMATION_TYPE , 0, 2); garis   -  person CiucaS    schedule 21.07.2015
comment
Layanan debugging tentu lebih sulit. Anda masih perlu melakukannya. Stack Overflow bukan pengganti debugging. Jika Anda belum melakukan debugging apa pun maka Anda tidak perlu bertanya lagi.   -  person David Heffernan    schedule 21.07.2015
comment
Saya tahu dari mana kesalahan itu berasal, saya tahu bagaimana cara memperbaikinya, itu bukan masalah saya. Masalah saya adalah saya tidak dapat mengetahui setiap pengecualian yang dapat dilontarkan Indy, itulah masalah saya yang sebenarnya, menangkap semua pengecualian dan mem-bypassnya.   -  person CiucaS    schedule 21.07.2015
comment
Yah, mungkin blok finally memunculkan pengecualian. atau bahkan bagian except.   -  person kobik    schedule 21.07.2015
comment
@kobik ini bukan blok akhirnya. Saya telah menjalankan prosedur tanpa mencoba akhirnya dan melakukan hal yang sama.   -  person CiucaS    schedule 21.07.2015
comment
@CiucaS Alasan Anda tidak boleh menjebak semua pengecualian adalah karena beberapa pengecualian menunjukkan masalah yang lebih besar. Misalnya. Jika kehabisan memori, pelanggaran akses, atau kesalahan jaringan umum terjadi (untuk beberapa nama), kemungkinan besar email Anda yang lain juga akan gagal. Skenario terburuknya, upaya Anda untuk bersikeras mengirim email lain dapat merusak bagian lain aplikasi Anda atau menyebabkan hasil/pesan/data yang salah. Anda dapat dengan mudah menjebak pengecualian tertentu: ubah pengendali Anda menjadi: on E: ESpecifcException do (Anda juga dapat memiliki beberapa pengecualian ini dalam blok kecuali).   -  person Disillusioned    schedule 21.07.2015


Jawaban (1)


Anda mengatakan bahwa Anda telah mengonfirmasi bahwa Anda masuk ke bagian akhirnya. Jadi ada 3 kemungkinan:

  1. Baris kode di bagian akhirnya menghalangi kode untuk melanjutkan.

  2. Pengecualian lain muncul di bagian akhirnya.

  3. Saat Anda memasuki bagian akhirnya, Anda sudah berada dalam "keadaan pengecualian". Jadi keluar dari akhirnya akan membawa Anda ke bagian akhirnya/kecuali berikutnya dalam tumpukan panggilan.

Anda harus menambahkan logging debug untuk mengonfirmasi yang mana, tapi saya curiga nomor 3. Kemungkinan pemicu untuk status pengecualian yang ada:

  • Instance Mail Anda tidak valid, dan penelan Anda terkena Pelanggaran Akses. Saat Anda mencoba lagi menggunakan Mail di bagian kecuali, Anda mendapatkan Pelanggaran Akses lagi.

  • Sesuatu di dalam MarkMailExecution memicu pengecualiannya sendiri.

  • (Saya berasumsi mekanisme logging Anda tidak gagal karena Anda telah mendapatkan beberapa informasi darinya.)

person Disillusioned    schedule 21.07.2015
comment
Anda benar, saya sudah mengomentari semuanya kecuali dan terakhir kecuali pesan Log, dan layanan tidak berhenti. Terima kasih! Saya rasa saya bisa menyelesaikannya dari sini. - person CiucaS; 21.07.2015