Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
- Buka aplikasi kanvas dalam mode edit.
- Buka tab Pengaturan>Pembaruan>Yang Dihentikan .
- 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.
- Buat layar baru di aplikasi Power Apps Canvas.
- Masukkan kontrol TextInput. Secara default, ini dialokasikan ke nama TextInput1.
- Masukkan kontrol label.
- Atur properti Teks dari kontrol label ke rumus
1/Value( TextInput1.Text )
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()
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() )
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 ) ) )
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.
Jika Anda mengetik 4, Anda mendapatkan hasil yang diharapkan yaitu 0,25.
Dan jika Anda mengetik sesuatu yang ilegal, seperti hello, maka Anda menerima banner kesalahan:
Ini adalah contoh pengantar sederhana. Anda dapat menangani kesalahan dengan berbagai cara, tergantung pada kebutuhan aplikasi:
- 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" )
- 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 :
Jika sel A2 merujuk ke A1 dengan rumus seperti =A1*2, kesalahan tersebut ikut tersebar melalui rumus tersebut.
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 :
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:
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.
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:
Tidak ada kesalahan yang dilaporkan, karena x tidak direferensikan. Namun, saat Anda menambahkan kontrol label dan mengatur properti Teksnya ke x, kesalahan ditampilkan:
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 :
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:
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:
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:
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:
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:
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:
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. |