Penanganan kesalahan

Perilaku yang dijelaskan dalam artikel ini hanya tersedia saat fitur manajemen kesalahan tingkat Rumus diaktifkan.

Power Fx mendukung penanganan kesalahan tingkat rumus. Fitur ini diaktifkan secara default untuk semua aplikasi baru. Namun, beberapa aplikasi lama mungkin menonaktifkannya di Pengaturan aplikasi. Aktifkan fitur ini.

  1. Buka aplikasi kanvas dalam mode edit.
  2. Buka tab Pengaturan>Pembaruan>Yang Dihentikan .
  3. Pastikan Pengelolaan tingkat rumus tidak diaktifkan.

Untuk informasi selengkapnya, lihat Mengontrol fitur mana yang diaktifkan.

Kesalahan terjadi. Jaringan turun, penyimpanan penuh, aliran nilai tidak terduga masuk. Penting agar logika Anda terus berfungsi dengan benar dalam mengatasi masalah yang mungkin.

Secara default, kesalahan mengalir melalui rumus aplikasi dan dilaporkan ke pengguna akhir aplikasi. Dengan cara ini, pengguna akhir tahu sesuatu yang tidak terduga terjadi. Mereka berpotensi memperbaiki masalah itu sendiri dengan input yang berbeda, atau mereka dapat melaporkan masalah kepada pemilik aplikasi.

Sebagai pembuat aplikasi, kendalikan kesalahan di aplikasi Anda:

  • Mendeteksi dan menangani kesalahan. Jika ada kemungkinan kesalahan mungkin terjadi, tulis rumus aplikasi untuk mendeteksi kondisi kesalahan dan coba lagi operasi. Pengguna akhir tidak perlu khawatir bahwa terjadi kesalahan karena pembuat mempertimbangkan kemungkinan tersebut. Ambil kesalahan dengan menggunakan fungsi IfError, IsError, dan IsErrorOrBlank dalam rumus.
  • Laporkan kesalahan. Jika suatu kesalahan tidak ditangani dalam rumus tempat Anda mengalaminya, kesalahan tersebut akan diteruskan ke handler App.OnError. Anda tidak dapat mengganti kesalahan karena sudah terjadi dan merupakan bagian dari perhitungan rumus. Namun Anda dapat menggunakan App.OnError untuk mengontrol cara melaporkan kesalahan kepada pengguna akhir, termasuk menekan pelaporan kesalahan secara bersamaan. App.OnError juga menyediakan titik pusat umum untuk pelaporan kesalahan di seluruh aplikasi.
  • Membuat dan menumbuhkan kembali kesalahan. Terakhir, Anda mungkin mendeteksi kondisi kesalahan dengan logika Anda sendiri, kondisi yang khusus untuk aplikasi Anda. Gunakan fungsi Kesalahan untuk membuat kesalahan kustom. Gunakan fungsi Kesalahan untuk melempar ulang kesalahan setelah ditangani di IfError atau App.OnError.

Memulai Langkah Pertama

Mari mulai dengan contoh sederhana.

  1. Buat layar baru di aplikasi Power Apps Canvas.
  2. Masukkan kontrol TextInput. Secara default, ini dialokasikan ke nama TextInput1.
  3. Masukkan kontrol label.
  4. Atur properti Teks dari kontrol label ke rumus
1/Value( TextInput1.Text )

Cuplikan layar banner kesalahan ditampilkan dengan 'nilai tidak dapat dikonversi ke angka' untuk kontrol input teks yang berisi 'Input teks'.

Anda melihat kesalahan karena teks default kontrol TextInput adalah "Text input", yang tidak dapat dikonversi menjadi angka. Secara default ini adalah hal yang baik: pengguna akhir mendapatkan pemberitahuan bahwa ada sesuatu yang tidak berfungsi seperti yang diharapkan di aplikasi.

Jelas, Anda tidak ingin kesalahan muncul setiap kali pengguna memulai aplikasi ini. Kemungkinan "Text input" bukan default yang tepat untuk kotak input teks. Untuk memperbaiki masalah ini, ubah properti Default kontrol TextInput menjadi:

Blank()

Cuplikan layar banner kesalahan ditampilkan dengan 'pembagian menurut nol'.

Hmm, sekarang kamu melihat kesalahan yang berbeda. Operasi matematika dengan kosong, seperti pembagian, memaksa nilai kosong menjadi nol. Nilai tersebut menyebabkan pembagian dengan kesalahan nol. Untuk memperbaiki masalah ini, Anda perlu memutuskan perilaku yang sesuai untuk situasi ini di aplikasi ini. Jawabannya mungkin menampilkan kosong ketika input teks kosong. Anda dapat mencapai tujuan ini dengan membungkus rumus Anda dengan fungsi IfError :

IfError( 1/Value( TextInput1.Text ), Blank() )

Cuplikan layar memperlihatkan tidak ada banner kesalahan yang ditampilkan, kesalahan karena nilai kosong telah diganti dengan kosong.

Sekarang kesalahan diganti dengan nilai yang valid dan banner kesalahan hilang. Tetapi, Anda mungkin melebihi, IfError yang Anda gunakan mencakup semua kesalahan, termasuk menginput nilai buruk seperti "hello". Anda dapat mengatasi masalah ini dengan menyetel IfError Anda untuk menangani kasus pembagian dengan nol saja dan melempar ulang semua kesalahan lainnya.

IfError( 1/Value( TextInput1.Text ), 
         If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )

Cuplikan layar menunjukkan bahwa tidak ada banner kesalahan yang ditampilkan, kesalahan yang disebabkan secara khusus oleh pembagian dengan nol telah digantikan oleh ruang kosong; jika tidak, kesalahan akan dilemparkan kembali.

Jadi, jalankan aplikasi Anda dan coba beberapa nilai yang berbeda.

Tanpa nilai apa pun, saat aplikasi dimulai, tidak ada jawaban yang ditampilkan karena nilai default-nya adalah kosong. Namun, tidak ada pesan kesalahan yang muncul karena IfError menggantikan kesalahan pembagian dengan nol.

Cuplikan layar memperlihatkan tidak ada jawaban yang ditampilkan dan tidak ada banner kesalahan.

Jika Anda mengetik 4, Anda mendapatkan hasil yang diharapkan yaitu 0,25.

Cuplikan layar memperlihatkan 0,25 ditampilkan dan tidak ada banner kesalahan.

Dan jika Anda mengetik sesuatu yang ilegal, seperti hello, maka Anda menerima banner kesalahan:

Cuplikan layar memperlihatkan tidak ada nilai yang ditampilkan dan banner kesalahan muncul karena ketidakmampuan untuk mengonversi 'hello' ke dalam bentuk angka.

Ini adalah contoh pengantar sederhana. Anda dapat menangani kesalahan dengan berbagai cara, tergantung pada kebutuhan aplikasi:

  1. Alih-alih banner kesalahan, Anda dapat menampilkan "#Error" dalam kontrol label dengan rumus. Untuk menjaga jenis penggantian tetap kompatibel dengan argumen pertama ke IfError, Anda perlu mengonversi hasil numerik secara eksplisit menjadi string teks dengan menggunakan fungsi Teks .
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Cuplikan layar yang menunjukkan tidak ada banner kesalahan dan sebaliknya #Error ditampilkan sebagai hasilnya.
  2. Alih-alih membungkus instans khusus ini dengan IfError, Anda dapat menulis handler App.OnError terpusat. Anda tidak dapat mengganti string yang ditampilkan dengan "#Error" karena kesalahan sudah terjadi dan App.OnError hanya disediakan untuk mengontrol pelaporan.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Penyebaran kesalahan

Kesalahan mengalir melalui rumus seperti di Excel. Misalnya, di Excel, jika sel A1 memiliki rumus =1/0, maka A1 menampilkan nilai #DIV0!kesalahan :

Cuplikan layar lembar bentang Excel dengan A1=1/0 dan #DIV/0! diperlihatkan dalam sel.

Jika sel A2 merujuk ke A1 dengan rumus seperti =A1*2, kesalahan tersebut ikut tersebar melalui rumus tersebut.

Cuplikan layar lembar bentang Excel dengan A2=A1*2 dan #DIV/0! diperlihatkan dalam sel.

Kesalahan menggantikan nilai yang seharusnya dihitung oleh rumus. Tidak ada hasil untuk perkalian dalam sel A2, hanya kesalahan dari pembagian di A1.

Power Fx berfungsi dengan cara yang sama. Secara umum, jika Anda memberikan kesalahan sebagai argumen ke fungsi atau operator, operasi tidak terjadi. Kesalahan input merambat dan menjadi bagian dari hasil operasi. Misalnya, Mid( Text( 1/0 ), 1, 1 ) mengembalikan kesalahan Division by Zero, karena kesalahan terdalam melewati fungsi Text dan fungsi Mid :

Cuplikan layar banner kesalahan memperlihatkan operasi yang tidak valid: pembagian dengan nol.

Secara umum, kesalahan tidak diteruskan ke properti kontrol Power Apps. Mari kita perluas contoh sebelumnya dengan kontrol lain yang ditampilkan jika properti label Text pertama adalah status kesalahan:

Cuplikan layar memperlihatkan tidak ada kesalahan yang ditampilkan pada kontrol label kedua.

Tidak masalah bahwa kesalahan tidak menyebar melalui kontrol karena sistem mengamati kesalahan pada input ke semua properti kontrol. Kesalahan tidak hilang.

Sebagian besar fungsi dan operator mengikuti aturan "kesalahan masuk, kesalahan keluar", namun ada beberapa pengecualian. Fungsi IsError, IsErrorOrBlank, dan IfError dirancang untuk bekerja dengan kesalahan, sehingga mereka mungkin tidak mengembalikan kesalahan bahkan jika ada yang diteruskan ke dalamnya.

Mengamati kesalahan

Power Fx tidak mendeteksi kesalahan sampai nilai kesalahan digunakan dalam rumus.

Akibatnya, fungsi If dan Select mungkin tidak mengembalikan kesalahan jika diteruskan. Pertimbangkan rumus If( false, 1/0, 3 ). Ada kesalahan pembagian dengan nol dalam rumus ini, tetapi karena fungsi If tidak mengambil bagian tersebut karena kondisi false, Power Fx dan Power Apps tidak melaporkan kesalahan.

Cuplikan layar memperlihatkan tidak ada banner kesalahan yang ditampilkan dengan fungsi If di properti Teks label.

Menggunakan fungsi Set dengan kesalahan tidak melaporkan kesalahan pada saat kesalahan ditempatkan ke dalam variabel. Misalnya dalam Power Apps, berikut adalah rumus di App.OnStart yang menempatkan pembagian berdasarkan nol kesalahan ke dalam variabel x:

Cuplikan layar memperlihatkan tidak ada banner kesalahan yang ditampilkan dengan Atur panggilan fungsi di App.OnStart.

Tidak ada kesalahan yang dilaporkan, karena x tidak direferensikan. Namun, saat Anda menambahkan kontrol label dan mengatur properti Teksnya ke x, kesalahan ditampilkan:

Cuplikan layar memperlihatkan banner kesalahan yang ditampilkan dengan kontrol label yang mereferensikan variabel x.

Anda dapat mengamati kesalahan dalam rumus dengan menggunakan fungsi IfError, IsError, dan IsErrorOrBlank . Dengan menggunakan fungsi ini, Anda dapat mengembalikan nilai alternatif, mengambil tindakan alternatif, atau mengubah kesalahan sebelum diamati dan dilaporkan.

Melaporkan Kesalahan

Setelah Power Fx mengamati kesalahan, langkah selanjutnya adalah melaporkan kesalahan kepada pengguna akhir.

Tidak seperti Excel, tidak selalu ada tempat yang nyaman untuk menampilkan hasil kesalahan, karena hasil rumus mungkin mempengaruhi properti seperti koordinat X dan Y kontrol yang tidak ada tempat nyaman untuk menampilkan teks. Setiap host Power Fx mengontrol cara menampilkan kesalahan pada akhirnya kepada pengguna akhir dan seberapa besar kontrol yang dilakukan pembuat atas proses ini. Pada Power Apps, banner kesalahan ditampilkan dan App.OnError digunakan untuk mengontrol cara kesalahan dilaporkan.

Perlu diketahui bahwa App.OnError tidak dapat mengganti kesalahan dengan cara yang sama seperti yang dapat dilakukan IfError . Pada titik app.onerror dijalankan, kesalahan sudah terjadi, dan hasilnya disebarluaskan melalui rumus lain. App.OnError hanya mengontrol bagaimana kesalahan dilaporkan ke pengguna akhir dan menyediakan kait bagi pembuat untuk mencatat kesalahan jika diinginkan.

Variabel cakupan FirstError dan AllErrors memberikan informasi konteks tentang kesalahan atau kesalahan-kesalahan. Konteks ini menyediakan informasi tentang jenis kesalahan, tempat kesalahan berasal, dan tempatnya diamati.

Berhenti setelah kesalahan

Rumus perilaku mendukung mengambil tindakan, memodifikasi database, dan mengubah status. Rumus ini memungkinkan lebih dari satu tindakan dilakukan secara berurutan dengan menggunakan ; operator rantai (atau ;; tergantung pada lokal).

Dalam hal ini, misalnya, kontrol grid menunjukkan apa yang ada di tabel T. Setiap tombol memilih perubahan status di tabel ini dengan dua panggilan Patch :

Cuplikan layar animasi memperlihatkan dua rekaman dalam tabel T diperbarui dengan angka acak setelah setiap klik tombol.

Dalam rumus perilaku berantai, tindakan tidak berhenti setelah kesalahan pertama. Mari modifikasikan contoh kita untuk melewatkan nomor indeks tidak valid pada panggilan Patch pertama. Patch kedua berlanjut meskipun terjadi kesalahan sebelumnya. Kesalahan pertama dilaporkan ke pengguna akhir, dan ditampilkan sebagai kesalahan di Studio pada kontrol:

Cuplikan layar animasi hanya memperlihatkan rekaman kedua dalam tabel T yang diperbarui dengan angka acak setelah setiap klik tombol, rekaman pertama yang mengakibatkan kesalahan.

Gunakan IfError untuk menghentikan eksekusi setelah kesalahan. Mirip dengan fungsi If, argumen ketiga terhadap fungsi ini menyediakan tempat untuk menempatkan tindakan yang harus dijalankan hanya jika tidak ada kesalahan:

Cuplikan layar animasi yang memperlihatkan tidak ada perubahan pada rekaman dalam tabel T, karena IfError mencegah operasi kedua selesai setelah kesalahan.

Jika terjadi kesalahan selama salah satu iterasi ForAll, perulangan lainnya tidak berhenti. ForAll dirancang untuk mengeksekusi setiap iterasi secara independen, memungkinkan eksekusi paralel. Ketika ForAll selesai, kesalahan dikembalikan, yang berisi semua kesalahan yang ditemui (dengan memeriksa AllErrors di IfError atau App.OnError).

Misalnya, rumus berikut menghasilkan ForAll yang mengembalikan dua kesalahan (untuk pembagian dengan nol untuk Value 0, dua kali) dan Collection memiliki tiga rekaman (ketika Value bukan 0): [1, 2, 3].

Clear( Collection ); 
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );

Menangani beberapa kesalahan

Karena rumus perilaku dapat mengeksekusi lebih dari satu tindakan, rumus ini juga dapat menemui lebih dari satu kesalahan.

Secara default, aplikasi melaporkan kesalahan pertama kepada pengguna akhir. Dalam contoh ini, kedua panggilan Patch gagal, tetapi panggilan kedua gagal dengan pembagian dengan kesalahan nol. Pengguna hanya melihat kesalahan pertama tentang indeks:

Cuplikan layar kesalahan indeks pertama ditampilkan dalam banner kesalahan, kesalahan kedua tidak dilaporkan.

Fungsi IfError dan App.OnError dapat mengakses semua kesalahan yang ditemui dengan menggunakan variabel cakupan AllErrors . Dalam hal ini, Anda dapat mengatur variabel ini ke variabel global dan melihat kedua kesalahan yang dihadapi. Semua itu muncul di tabel dalam urutan yang sama mereka ditemui:

Cuplikan layar kemasukan kesalahan ke dalam variabel global PatchErrors di mana dapat terlihat bahwa kedua kesalahan ada.

Rumus non-perilaku juga dapat mengembalikan beberapa kesalahan. Contohnya, menggunakan fungsi Patch dengan kumpulan rekaman untuk diperbarui dapat menghasilkan beberapa kesalahan, satu untuk setiap rekaman yang gagal.

Kesalahan dalam tabel

Seperti yang Anda lihat sebelumnya, Anda dapat menyimpan kesalahan dalam variabel. Anda juga dapat menyertakan kesalahan dalam struktur data, seperti tabel. Pendekatan ini penting karena memastikan bahwa kesalahan pada satu rekaman tidak dapat membatalkan seluruh tabel.

Misalnya, pertimbangkan kontrol tabel data ini di Power Apps:

Cuplikan layar tabel data memperlihatkan kesalahan untuk bidang Reciprocal untuk input 0, yang menghasilkan pembagian dengan kesalahan nol.

Perhitungan di AddColumns mengalami kesalahan pembagian dengan nol untuk salah satu nilai. Untuk rekaman yang satu ini, kolom Timbal Balik memiliki nilai kesalahan (pembagian dengan nol) namun rekaman lain tidak demikian dan baik-baik saja. IsError( Index( output, 2 ) ) mengembalikan false dan IsError( Index( output, 2 ).Value ) mengembalikan true.

Jika terjadi kesalahan saat memfilter tabel, seluruh rekaman adalah kesalahan. Operasi masih mengembalikan rekaman dalam hasil sehingga pengguna akhir tahu ada sesuatu di sana dan ada masalah.

Misalnya contoh ini. Di sini, tabel asli tidak memiliki kesalahan, namun tindakan pemfilteran membuat kesalahan bila Nilai sama dengan 0:

Cuplikan layar tabel data memperlihatkan kesalahan untuk dua rekaman yang tidak dapat diproses oleh kriteria Filter.

Nilai -5 dan -3 difilter dengan benar. Nilai 0 mengakibatkan kesalahan dalam memproses filter, jadi tidak jelas apakah rekaman harus disertakan atau tidak dalam hasilnya. Untuk memaksimalkan transparansi bagi pengguna akhir dan pembuat bantuan debug, operasi menyertakan catatan kesalahan sebagai pengganti aslinya. Dalam kasus ini, IsError( Index( output, 2 ) ) menghasilkan true.

Kesalahan sumber data

Fungsi yang memodifikasi data dalam sumber data, seperti Patch, Collect, Remove, RemoveIf, Update, UpdateIf, and SubmitForm melaporkan kesalahan dalam dua cara:

  • Masing-masing fungsi ini mengembalikan nilai kesalahan sebagai hasil operasi. Anda dapat mendeteksi kesalahan dengan menggunakan IsError dan mengganti atau menekan kesalahan dengan menggunakan IfError dan App.OnError seperti biasa.
  • Setelah operasi, fungsi Kesalahan juga mengembalikan kesalahan untuk operasi sebelumnya. Perilaku ini dapat berguna untuk menampilkan pesan kesalahan pada layar formulir tanpa perlu mengambil kesalahan dalam variabel status.

Misalnya, rumus ini memeriksa kesalahan dari Kumpulkan dan menampilkan pesan kesalahan kustom:

IfError( Collect( Names, { Name: "duplicate" } ),
         Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )

Fungsi Errors juga menghasilkan informasi tentang kesalahan sebelumnya selama operasi runtime. Ini dapat berguna untuk menampilkan kesalahan pada layar formulir tanpa harus mengambil kesalahan dalam variabel status.

Melempar ulang kesalahan

Terkadang Anda mengharapkan potensi kesalahan dan dapat mengabaikannya dengan aman. Di dalam IfError dan App.OnError, jika kesalahan terdeteksi yang harus dioper ke handler yang satu tingkat lebih tinggi, lempar ulang menggunakan Error( AllErrors ).

Membuat kesalahan Anda sendiri

Anda juga dapat membuat kesalahan Anda sendiri dengan menggunakan fungsi Kesalahan .

Jika Anda membuat kesalahan Anda sendiri, gunakan nilai yang lebih besar dari 1.000 untuk menghindari potensi konflik dengan nilai kesalahan sistem di masa mendatang.

Nilai dari enum ErrorKind

enum ErrorKind Nilai Description
Kesalahan Analisis 18 Kesalahan sistem. Ada masalah dengan analisis kompilator.
BadLanguageCode 14 Kode bahasa yang tidak valid atau tidak dikenal digunakan.
BadRegex 15 Ekspresi reguler tidak valid. Periksa sintaks yang digunakan dengan fungsi IsMatch, Match, atau MatchAll.
Conflict 6 Catatan yang Anda perbarui sudah diubah di sumbernya dan Anda perlu mengatasi konflik. Solusi umum adalah menyimpan perubahan lokal, me-refresh rekaman, dan menerapkan ulang perubahan.
KendalaDilanggar 8 Rekaman tidak melewati pemeriksaan batasan di server.
PembuatanIzin 3 Anda tidak memiliki izin untuk membuat rekaman untuk sumber data. Misalnya, fungsi Collect dipanggil.
HapusIzin 5 Anda tidak memiliki izin untuk menghapus rekaman untuk sumber data. Misalnya, fungsi Remove dipanggil.
Div0 13 Pembagian oleh bilangan nol.
UbahIzin 4 Anda tidak memiliki izin untuk membuat rekaman untuk sumber data. Misalnya, fungsi Patch dipanggil.
NilaiDihasilkan 9 Nilai secara keliru diteruskan ke server untuk bidang yang dihitung server secara otomatis.
InvalidFunctionUsage (Penggunaan Fungsi Tidak Valid) 16 Penggunaan fungsi tidak valid. Sering kali satu atau beberapa argumen terhadap fungsi salah atau digunakan dengan cara yang tidak valid.
BerkasTidakDitemukan 17 penyimpanan SaveData tidak dapat ditemukan.
Memori Tidak Cukup 21 Memori atau penyimpanan pada perangkat tidak cukup untuk operasi.
InvalidArgument 25 Argumen tidak valid diteruskan ke fungsi.
Internal 26 Kesalahan sistem. Ada masalah internal dengan salah satu fungsi.
HilangDiperlukan 2 Bidang catatan yang diperlukan hilang.
Network 23 Ada masalah dengan komunikasi jaringan.
None 0 Kesalahan sistem. Tidak ada kesalahan.
Tidak Berlaku 27 Nilai tidak tersedia. Kesalahan ini berguna untuk membedakan nilai kosong yang dapat diperlakukan sebagai nol dalam perhitungan numerik, dari nilai kosong yang harus ditandai sebagai masalah potensial jika nilai digunakan.
Tidak Ditemukan 7 Rekaman tidak dapat ditemukan. Contohnya, rekaman yang akan dimodifikasi pada fungsi Patch.
Tidak didukung 20 Operasi tidak didukung oleh pemutar atau perangkat ini.
Numeric 24 Fungsi numerik digunakan dengan cara yang tidak semestinya. Misalnya, Sqrt dengan -1.
Kuota Terlampaui 22 Kuota penyimpanan terlampaui.
ReadOnlyValue 10 Kolom hanya dapat dibaca dan tidak dapat dimodifikasi.
Izin Membaca 19 Anda tidak memiliki izin untuk membaca rekaman untuk sumber data.
Sinkronisasi 1 Sumber data melaporkan kesalahan. Periksa kolom Pesan untuk informasi lebih lanjut.
Unknown 12 Ada kesalahan, namun dari jenis yang tidak diketahui.
Validation 11 Rekaman tidak melewati pemeriksaan validasi.