Bagikan melalui


Pengecualian Dasar Alur Kerja Windows

Alur kerja dapat menggunakan aktivitas TryCatch untuk menangani pengecualian yang dinaikkan selama eksekusi alur kerja. Pengecualian ini dapat ditangani atau dapat dilemparkan kembali menggunakan aktivitas Rethrow. Aktivitas di bagian Finally dijalankan saat bagian Try atau bagian Catches selesai. Alur kerja yang dihosting oleh instans WorkflowApplication juga dapat menggunakan penanganan aktivitas OnUnhandledException untuk menangani pengecualian yang tidak ditangani oleh aktivitas TryCatch.

Penyebab Pengecualian

Dalam alur kerja, pengecualian dapat dihasilkan dengan cara berikut:

  • Batas waktu transaksi di TransactionScope.

  • Pengecualian eksplisit yang dilemparkan oleh alur kerja menggunakan aktivitas Throw.

  • Pengecualian .NET Framework 4.6.1 yang dilemparkan dari aktivitas.

  • Pengecualian yang dilemparkan dari kode eksternal, seperti pustaka, komponen, atau layanan yang digunakan dalam alur kerja.

Menangani Pengecualian

Jika pengecualian ditampilkan oleh aktivitas dan tidak tertangani, perilaku defaultnya adalah mengakhiri instans alur kerja. Jika ada handler OnUnhandledException kustom, handler kustom dapat mengambil alih perilaku default ini. Handler ini memberi penulis host alur kerja kesempatan untuk memberikan penanganan yang sesuai, seperti pengelogan kustom, membatalkan alur kerja, membatalkan alur kerja, atau mengakhiri alur kerja. Jika alur kerja memunculkan pengecualian yang tidak ditangani, handler OnUnhandledException akan dipanggil. Ada tiga kemungkinan tindakan yang dikembalikan dari OnUnhandledException yang menentukan hasil akhir alur kerja.

  • Batal - Instans alur kerja yang dibatalkan adalah keluar dari eksekusi cabang dengan baik. Anda dapat memodelkan perilaku pembatalan (misalnya, dengan menggunakan aktivitas CancellationScope). Handler Selesai dipanggil ketika proses pembatalan selesai. Alur kerja yang dibatalkan berada dalam status Dibatalkan.

  • Hentikan - Instans alur kerja yang dihentikan tidak dapat dilanjutkan atau dimulai ulang. Ini memicu peristiwa Selesai di mana Anda dapat memberikan pengecualian sebagai alasan dihentikannya. Handler yang Dihentikan dipanggil ketika proses penghentian selesai. Alur kerja yang dihentikan berada dalam status Rusak.

  • Pembatalan - Instans alur kerja yang dibatalkan hanya dapat dilanjutkan jika telah dikonfigurasi agar persisten. Tanpa persistensi, alur kerja tidak dapat dilanjutkan. Pada titik alur kerja dibatalkan, pekerjaan apa pun yang dilakukan (dalam memori) sejak titik persistensi terakhir akan hilang. Untuk alur kerja yang dibatalkan, handler Dibatalkan dipanggil menggunakan pengecualian sebagai alasan ketika proses pembatalan selesai. Namun, tidak seperti Dibatalkan dan Dihentikan, handler selesai tidak dipanggil. Alur kerja yang dibatalkan dalam status Dibatalkan.

Contoh berikut memanggil alur kerja yang melemparkan pengecualian. Pengecualian tidak ditangani oleh alur kerja dan handler OnUnhandledException dipanggil. WorkflowApplicationUnhandledExceptionEventArgs diperiksa untuk memberikan informasi tentang pengecualian, dan alur kerja dihentikan.

Activity wf = new Sequence
{
    Activities =
     {
         new WriteLine
         {
             Text = "Starting the workflow."
         },
         new Throw
        {
            Exception = new InArgument<Exception>((env) =>
                new ApplicationException("Something unexpected happened."))
        },
        new WriteLine
         {
             Text = "Ending the workflow."
         }
     }
};

WorkflowApplication wfApp = new WorkflowApplication(wf);

wfApp.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
{
    // Display the unhandled exception.
    Console.WriteLine("OnUnhandledException in Workflow {0}\n{1}",
        e.InstanceId, e.UnhandledException.Message);

    Console.WriteLine("ExceptionSource: {0} - {1}",
        e.ExceptionSource.DisplayName, e.ExceptionSourceInstanceId);

    // Instruct the runtime to terminate the workflow.
    return UnhandledExceptionAction.Terminate;

    // Other choices are UnhandledExceptionAction.Abort and
    // UnhandledExceptionAction.Cancel
};

wfApp.Run();

Menangani Pengecualian dengan Aktivitas TryCatch

Menangani pengecualian di dalam alur kerja dilakukan dengan aktivitas TryCatch. Aktivitas TryCatch ini memiliki kumpulan Catches aktivitas Catch yang masing-masing terkait dengan jenis tertentu Exception. Jika pengecualian yang dilontarkan oleh aktivitas yang terdapat di bagian Try dari aktivitas TryCatch cocok dengan pengecualian aktivitas Catch<TException> dalam kumpulan Catches, maka pengecualian akan ditangani. Jika pengecualian ditampilkan kembali secara eksplisit atau pengecualian baru ditampilkan maka pengecualian ini diteruskan ke aktivitas induk. Contoh kode berikut menunjukkan aktivitas TryCatch yang menangani ApplicationException yang ditampilkan di bagian Try oleh aktivitas Throw. Pesan pengecualian ditulis ke konsol oleh aktivitas Catch<TException>, lalu pesan ditulis ke konsol di bagian Finally.

DelegateInArgument<ApplicationException> ex = new DelegateInArgument<ApplicationException>()
{
    Name = "ex"
};

Activity wf = new TryCatch
{
    Try = new Throw()
    {
        Exception = new InArgument<Exception>((env) =>new ApplicationException("An ApplicationException was thrown."))
    },
    Catches =
    {
        new Catch<ApplicationException>
        {
            Action = new ActivityAction<ApplicationException>
            {
                Argument = ex,
                Handler = new WriteLine()
                {
                    Text = new InArgument<string>((env) => ex.Get(env).Message)
                }
            }
        }
    },
    Finally = new WriteLine()
    {
        Text = "Executing in Finally."
    }
};

Aktivitas di bagian Finally dijalankan bila bagian Try atau bagian Catches berhasil diselesaikan. Bagian Try berhasil diselesaikan jika tidak ada pengecualian yang dilemparkan darinya, dan bagian Catches berhasil diselesaikan jika tidak ada pengecualian yang dilemparkan atau dilempar kembali darinya. Jika pengecualian ditampilkan di bagian Try dari TryCatch dan tidak ditangani oleh Catch<TException> di bagian Catches, atau ditumbuhi kembali dari Catches, aktivitas dalam Finally tidak akan dijalankan kecuali salah satu hal berikut terjadi.

Penanganan Pengecualian versus Kompensasi

Perbedaan antara penanganan pengecualian dan kompensasi adalah bahwa penanganan pengecualian terjadi selama eksekusi aktivitas. Kompensasi terjadi setelah aktivitas berhasil diselesaikan. Penanganan pengecualian memberikan kesempatan untuk membersihkan setelah aktivitas menimbulkan pengecualian, sedangkan kompensasi memberikan mekanisme di mana pekerjaan yang berhasil diselesaikan dari aktivitas yang diselesaikan sebelumnya dapat dibatalkan. Untuk informasi lebih lanjut, lihat Kompensasi.

Lihat juga