Bagikan melalui


Penanganan kesalahan

Catatan

Perilaku yang dijelaskan di artikel ini hanya tersedia bila fitur pratinjau Manajemen kesalahan tingkat rumus melalui pengaturan>Fitur mendatang>Pratinjau diaktifkan. Informasi selengkapnya: Mengontrol fitur 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 mengetahui sesuatu yang tidak terduga terjadi, mereka dapat berpotensi memperbaiki masalah mereka sendiri dengan input yang berbeda, atau mereka dapat melaporkan masalah tersebut kepada pemilik aplikasi.

Sebagai pembuat aplikasi, Anda dapat mengontrol kesalahan dalam aplikasi:

  • Mendeteksi dan menangani kesalahan. Jika ada kemungkinan kesalahan terjadi, rumus aplikasi dapat ditulis untuk mendeteksi kondisi kesalahan dan mencoba lagi operasi. Pengguna akhir tidak perlu khawatir bahwa terjadi kesalahan karena pembuat mempertimbangkan kemungkinan tersebut. Hal ini dilakukan dengan fungsi IfError, IsError, dan IsErrorOrBlank dalam rumus.
  • Pelaporan Kesalahan. Jika kesalahan tidak ditangani dalam rumus yang ditemuinya, kesalahan tersebut kemudian diangkat ke penanganan App.OnError. Di sini, kesalahan tidak dapat lagi tergantikan karena telah 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 kekang umum untuk pelaporan kesalahan di seluruh aplikasi.
  • Membuat dan membangun ulang kesalahan. Terakhir, Anda dapat mendeteksi kondisi kesalahan dengan logika Anda sendiri, kondisi yang khusus untuk aplikasi Anda. Gunakan fungsi Kesalahan untuk membuat kesalahan kustom. Fungsi Kesalahan juga digunakan untuk membuat ulang kesalahan setelah di intergasi di IfError atau App.OnError.

Persiapan

Mari mulai dengan contoh sederhana.

  1. Buat layar baru di aplikasi kanvas Power Apps.
  2. Masukkan kontrol TextInput. Ini akan default ke nama TextInput1.
  3. Masukkan kontrol label.
  4. Atur properti Teks dari kontrol label ke rumus
1/Value( TextInput1.Text )

Banner kesalahan ditampilkan dengan

Kami memiliki kesalahan karena teks default dari kontrol TextInput adalah "Text input", yang tidak dapat dikonversi ke angka. Secara default, hal ini adalah hal yang baik: pengguna akhir akan mendapatkan pemberitahuan bahwa ada sesuatu yang tidak berfungsi seperti yang diharapkan dalam aplikasi.

Jelas, kita tidak ingin kesalahan untuk mengucapkan selamat datang kepada pengguna setiap mereka menjalankan aplikasi ini. Kemungkinan "Text input" bukan default yang tepat untuk kotak input teks. Untuk mengatasi ini, ubah properti Default kontrol TextInput ke:

Blank()

Banner kesalahan ditampilkan dengan

Hmm, sekarang kita memiliki kesalahan yang berbeda. Operasi logika dengan kosong, seperti pembagian, akan memaksa nilai kosong menjadi nol. Dan ini sekarang menyebabkan kesalahan pembagian dengan nol. Untuk mengatasi masalah ini, kita harus memutuskan perilaku yang sesuai untuk situasi ini di aplikasi ini. Jawaban mungkin ditampilkan kosong saat input teks kosong. Kita dapat mencapai hal ini dengan membungkus rumus kita dengan fungsi IfError:

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

Tidak ada banner kesalahan yang ditampilkan, kesalahan karena nilai kosong telah diganti dengan kosong

Sekarang kesalahan ganti dengan nilai yang valid dan banner kesalahan telah hilang. Namun, kita mungkin memiliki overshot, IfDYor yang kita gunakan mencakup semua kesalahan, termasuk mengetik nilai yang buruk seperti "hello". Kita dapat mengatasi ini dengan memperbaiki IfError kita untuk menangani kasus pembagian dengan nol hanya dengan dan memunculkan semua kesalahan lain:

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

Tidak ada spanduk kesalahan yang ditampilkan, kesalahan karena pembagian khusus dengan nol telah diganti dengan yang kosong, jika tidak, kesalahan akan dilemparkan kembali

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

Tanpa nilai apa pun, saat aplikasi dimulai, tidak ada jawaban yang ditampilkan sebagai nilai default kosong, tetapi juga tidak ada kesalahan yang ditampilkan saat IfError mengganti kesalahan pembagian dengan nol.

Tidak ada jawaban yang ditampilkan dan tidak ada spanduk kesalahan

Jika kita mengetik 4, kita mendapatkan hasil yang diharapkan 0,25:

0,25 ditampilkan dan tidak ada spanduk kesalahan

Dan jika kita mengetik sesuatu yang tidak sah, seperti hello, maka kita akan menerima banner kesalahan:

Tidak ada nilai yang ditampilkan dan spanduk kesalahan ditampilkan karena ketidakmampuan untuk mengubah

Ini adalah contoh introspektif sederhana. Penanganan kesalahan dapat dilakukan dengan berbagai cara, tergantung pada kebutuhan aplikasi:

  1. Alih-alih banner kesalahan, kita dapat menampilkan "#Error" pada kontrol label dengan rumus. Agar jenis penggantian tetap kompatibel dengan argumen pertama dengan IfError , kita harus mengkonversi secara eksplisit hasil numerik ke string teks dengan fungsi Teks.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Tidak ada banner kesalahan dan sebagai gantinya #Error ditampilkan sebagai hasilnya
  2. Alih-alih membungkus instans khusus ini dengan IfError , kita mungkin telah menulis penanganan App.OnError terpusat. Kami tidak dapat mengganti string yang ditampilkan dengan "#Error" karena kesalahan telah terjadi dan App.OnError hanya diberikan untuk mengontrol pelaporan.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Memperbanyak kesalahan

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

Spreadsheet Excel dengan A1 = 1/0 dan #DIV/0! diperlihatkan dalam sel

Jika sel A2 mengacu pada A1 dengan rumus seperti =A1*2, maka kesalahan juga menyebarkan melalui rumus tersebut:

Spreadsheet Excel dengan A2 = A1 * 2 dan #DIV / 0! diperlihatkan dalam sel

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

Power Fx berfungsi dengan cara yang sama. Secara umum, jika kesalahan diberikan sebagai argumen ke fungsi atau operator, operasi tidak akan terjadi dan kesalahan input akan mengalir sebagai hasil dari operasi. Contohnya, Mid( Text( 1/0 ), 1, 1 ) akan menghasilkan kesalahan Pembagian dengan nol, karena kesalahan paling banyak di dalam diteruskan melalui fungsi Teks dan Mid:

Banner kesalahan memperlihatkan operasi tidak valid: pembagian dengan nol

Secara umum, kesalahan tidak mengalir melalui properti kontrol Power Apps. Perluas contoh sebelumnya dengan kontrol tambahan yang ditampilkan jika properti Text label pertama adalah status kesalahan:

Tidak ada kesalahan yang ditampilkan pada kontrol label kedua

Tidak masalah jika kesalahan tidak disebar melalui kontrol karena sistem akan mengamati kesalahan pada input untuk semua properti kontrol. Kesalahan tidak akan hilang.

Sebagian besar fungsi dan operator mengikuti aturan "kesalahan masuk, kesalahan keluar", namun ada beberapa pengecualian. Fungsi IsError, IsErrorOrBlank, dan IfError dirancang untuk menangani kesalahan sehingga mereka tidak dapat menghasilkan kesalahan meskipun salah satu dilewatkan ke dalamnya.

Mengamati kesalahan

Kesalahan tidak teramati hingga nilainya digunakan.

Hasilnya, fungsi Jika dan Pilih juga tidak menghasilkan kesalahan jika diteruskan. Masukkan rumus If( false, 1/0, 3 ). Ada kesalahan pembagian dengan nol dalam rumus ini, tetapi karena If cabang tidak mengambil cabang tersebut karena false, Power Fx dan Power Apps tidak akan melaporkan kesalahan:

Banner tidak ada kesalahan yang diperlihatkan dengan fungsi If dalam properti Teks label

Menggunakan fungsi Set dengan kesalahan tidak akan melaporkan kesalahan pada titik kesalahan diletakkan ke variabel. Contohnya, Power Apps di sini adalah rumus di App.OnStart yang menempatkan kesalahan pembagian dengan nol ke variabel x:

Tidak ada spanduk kesalahan yang ditampilkan dengan Atur panggilan fungsi di App.OnStart

Tidak ada kesalahan yang dilaporkan, karena x tidak direferensikan. Namun, saat kita menambahkan kontrol Label, dan mengatur properti Teks-nya ke x, kesalahan ditampilkan;

Banner kesalahan ditampilkan dengan kontrol label yang merujuk variabel x

Anda dapat mengamati kesalahan dalam rumus dengan fungsi IfError, IsError, dan IsErrorOrBlank. Dengan fungsi ini, Anda dapat menghasilkan nilai alternatif, melakukan tindakan alternatif, atau memodifikasi kesalahan sebelum teramati dan dilaporkan.

Melaporkan Kesalahan

Setelah kesalahan teramati, langkah berikutnya adalah melaporkan kesalahan tersebut ke pengguna akhir.

Tidak seperti Excel, tidak selalu ada tempat yang nyaman untuk menampilkan hasil kesalahan, karena hasil rumus dapat mendorong properti seperti koordinat X dan Y dari kontrol yang mana tidak ada tempat mudah 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 telah terjadi, dan hasilnya telah disebarkan melalui rumus lain. App.OnError hanya mengontrol cara kesalahan dilaporkan ke pengguna akhir dan memberikan kait kepada pembuat untuk mencatat kesalahan jika diinginkan.

Variabel cakupan FirstError dan AllErrors memberikan informasi konteks tentang kesalahan atau kesalahan-kesalahan. Ini memberikan Informasi tentang jenis kesalahan dan asal kesalahan dan tempat teramatinya.

Berhenti setelah kesalahan

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

Di kasus ini, misalnya, kontrol kisi menampilkan yang ada di tabel T. Setiap tombol memilih perubahan status di tabel ini dengan dua panggilan Patch :

Animasi memperlihatkan dua catatan 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:

Animasi hanya memperlihatkan rekaman kedua dalam tabel T yang diperbarui dengan angka acak setelah setiap klik tombol, rekaman pertama menghasilkan kesalahan

IfError dapat digunakan 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:

Animasi memperlihatkan tidak ada perubahan pada salah satu rekaman dalam tabel T, karena IfError mencegah operasi kedua selesai setelah kesalahan

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

Contohnya, rumus berikut akan mengakibatkan ForAll menghasilkan dua kesalahan (untuk pembagian dengan nol untuk Value dari 0, dua kali) dan Collection akan memiliki tiga rekaman (untuk ketika Value tidak 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, kesalahan pertama dilaporkan ke pengguna akhir. Dalam contoh ini, panggilan Patch akan gagal, yang kedua dengan kesalahan pembagian dengan nol. Hanya kesalahan pertama (tentang indeks) yang ditampilkan ke pengguna:

Kesalahan indeks pertama ditampilkan dalam banner kesalahan, kesalahan kedua tidak dilaporkan

Fungsi IfError dan App.OnError dapat mengakses semua kesalahan yang dihadapi dengan variabel cakupan AllErrors. Di kasus ini, kita dapat mengaturnya ke variabel global dan melihat kedua kesalahan yang terjadi. Semua itu muncul di tabel dalam urutan yang sama mereka ditemui:

Tangkap kesalahan ke dalam variabel global PatchErrors di mana kita dapat melihat bahwa kedua kesalahan ada

Beberapa kesalahan dapat dihasilkan dalam rumus non-perilaku juga. Contohnya, menggunakan fungsi Patch dengan kumpulan rekaman untuk diperbarui dapat menghasilkan beberapa kesalahan, satu untuk setiap rekaman yang gagal.

Kesalahan dalam tabel

Seperti yang kita lihat sebelumnya, kesalahan dapat disimpan dalam variabel. Kesalahan juga dapat tercakup dalam struktur data, seperti tabel. Hal ini penting agar kesalahan pada salah satu rekaman tidak dapat membatalkan seluruh tabel.

Contohnya, pertimbangkan kontrol tabel data ini di Power Apps:

Tabel data memperlihatkan kesalahan untuk bidang Timbal balik untuk input 0, yang menghasilkan pembagian dengan nol kesalahan

Penghitungan di AddColumns telah menemui 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 kesalahan terjadi saat memfilter tabel, seluruh rekaman merupakan kesalahan namun tetap memberikan hasil sehingga pengguna akhir mengetahui ada sesuatu dan ada masalah.

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

Tabel data memperlihatkan kesalahan untuk dua rekaman yang tidak bisa 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 membantu debug oleh pembuat, kami menyertakan rekaman kesalahan sebagai ganti yang asli. 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:

  • Setiap fungsi ini akan menghasilkan nilai kesalahan sebagai hasil dari operasi. Kesalahan dapat terdeteksi dengan Is Errors dan mengganti atau diredam dengan IfError dan App.OnError seperti biasa.
  • Setelah operasi, fungsi Errors juga akan mengembalikan kesalahan untuk operasi sebelumnya. Ini dapat berguna untuk menampilkan pesan kesalahan pada layar formulir tanpa harus mengambil kesalahan dalam variabel status.

Contohnya, rumus ini akan memeriksa kesalahan dari Collect 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.

Membuat ulang kesalahan

Terkadang, beberapa kemungkinan kesalahan terjadi dan dapat diabaikan dengan aman. Di dalam IfError dan App.OnError, jika kesalahan terdeteksi yang harus diteruskan ke penanganan yang lebih tinggi berikutnya, ia dapat dimunculkan lagi dengan Error( AllErrors ).

Membuat kesalahan Anda sendiri

Anda juga dapat membuat kesalahan sendiri dengan fungsi Error.

Jika Anda membuat kesalahan sendiri, sebaiknya gunakan nilai di atas 1000 untuk menghindari kemungkinan konflik dengan nilai kesalahan sistem di masa mendatang.

Nilai enum ErrorKind

enum ErrorKind Nilai Description
AnalysisError 18 Kesalahan Sistem. Ada masalah dengan analisis compiler.
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.
Konflik 6 Rekaman yang sedang diperbarui telah diubah pada sumber dan konflik harus diselesaikan. Solusi umum adalah menyimpan perubahan lokal, me-refresh rekaman, dan menerapkan ulang perubahan.
ConstraintViolated 8 Rekaman tidak melewati pemeriksaan batasan di server.
CreatePermission 3 Pengguna tidak memiliki izin membuat rekaman untuk sumber data. Misalnya, fungsi Collect dipanggil.
DeletePermissions 5 Pengguna tidak memiliki izin menghilangkan rekaman untuk sumber data. Misalnya, fungsi Remove dipanggil.
Div0 13 Pembagian dengan nol.
EditPermissions 4 Pengguna tidak memiliki izin membuat rekaman untuk sumber data. Misalnya, fungsi Patch dipanggil.
GeneratedValue 9 Nilai dilewatkan secara tidak tepat ke server untuk bidang yang secara otomatis dihitung oleh server.
InvalidFunctionUsage 16 Penggunaan fungsi tidak valid. Sering kali satu atau beberapa argumen terhadap fungsi salah atau digunakan dengan cara yang tidak valid.
FileNotFound 17 penyimpanan SaveData tidak dapat ditemukan.
InsufficientMemory 21 Memori atau penyimpanan di perangkat tidak memadai untuk pengoperasiannya.
InvalidArgument 25 Argumen tidak valid diteruskan ke fungsi.
Internal 26 Kesalahan Sistem. Ada masalah internal dengan salah satu fungsi.
MissingRequired 2 Bidang rekaman yang diperlukan tidak ada.
Jaringan 23 Terjadi masalah dengan komunikasi jaringan.
Tidak ada 0 Kesalahan Sistem. Tidak ada kesalahan.
Tidak Berlaku 27 Nilai tidak tersedia. Berguna untuk membedakan nilai kosong yang dapat dianggap sebagai nol dalam perhitungan numerik dari nilai kosong yang harus ditandai sebagai potensi masalah jika nilai digunakan.
NotFound 7 Rekaman tidak dapat ditemukan. Contohnya, rekaman yang akan dimodifikasi pada fungsi Patch.
NotSupported 20 Operasi tidak didukung oleh pemutar atau perangkat ini.
Numerik 24 Fungsi numerik digunakan dengan cara yang tidak semestinya. Misalnya, Sqrt dengan -1.
QuoteExceeded 22 Kuota penyimpanan terlampaui.
ReadOnlyValue 10 Kolom hanya dapat dibaca dan tidak dapat dimodifikasi.
ReadPermission 19 Pengguna tidak memiliki izin membaca rekaman untuk sumber data.
Sinkronkan 1 Kesalahan dilaporkan oleh sumber data. Periksa kolom Pesan untuk informasi lebih lanjut.
Tidak diketahui 12 Ada kesalahan, namun dari jenis yang tidak diketahui.
Validasi 11 Rekaman tidak melewati pemeriksaan validasi.