Hata yönetimi

Bu makalede açıklanan davranış yalnızca Formül düzeyi hata yönetimi özelliği açık olduğunda kullanılabilir.

Power Fx formül düzeyinde hata işlemeyi destekler. Bu özellik tüm yeni uygulamalar için varsayılan olarak açıktır. Ancak bazı eski uygulamalarda uygulama Ayarları'nda kapatılmış olabilir. Bu özelliği açık tutun.

  1. Tuval uygulamasını düzenleme modunda açın.
  2. Ayarlar>Güncelleştirmeleri>Kullanımdan Kaldırıldı sekmesine gidin.
  3. Formül düzeyinde yönetimi devre dışı bırak'ın kapalı olduğundan emin olun.

Daha fazla bilgi için bkz. Hangi özelliklerin etkinleştirildiğini denetleme.

Hatalar ortaya çıkar. Ağlar çöker, depolama alanı dolar, beklenmedik değerler girilir. Olası sorunlar karşısında mantığınızın düzgün çalışmaya devam etmesi önemlidir.

Varsayılan olarak hatalar bir uygulamanın formülleri üzerinden akar ve uygulamanın son kullanıcısına bildirilir. Bu şekilde, son kullanıcı beklenmeyen bir şey olduğunu bilir. Sorunu farklı bir girişle kendileri çözebilir veya uygulamanın sahibine bildirebilirler.

Uygulama oluşturucu olarak uygulamanızdaki hataların denetimini alın:

  • Bir hatayı algılama ve işleme. Hata oluşma olasılığı varsa, hata koşulunu algılamak için uygulamanın formüllerini yazın ve işlemi yeniden deneyin. Son kullanıcının, üretici bu sorumluluğu dikkate aldığı için bir hata oluştuğu konusunda endişelenmesine gerek yoktur. Bir formül içinde IfError, IsError ve IsErrorOrBlank işlevlerini kullanarak hatayı yakalayın.
  • Hata bildirin. Karşılaştığınız formülde bir hata işlenmezse, hata App.OnError işleyicisine iletilir. Zaten oluştuğundan ve formül hesaplamalarının bir parçası olduğundan hatayı değiştiremezsiniz. Ancak hatanın son kullanıcıya nasıl bildirileceğini kontrol etmek için App.OnError'ı kullanabilirsiniz, buna hata raporlamasını tamamen bastırmak da dahildir. App.OnError ayrıca uygulamanın tamamında hata raporlama için ortak bir tıkanma noktası sağlar.
  • Hata oluşturma ve tekrar fırlatma. Son olarak, uygulamanıza özgü bir koşul olan kendi mantığınızla bir hata koşulu algılayabilirsiniz. Özel hatalar oluşturmak için Error işlevini kullanın. IfError veya App.OnError'da sorgulandıktan sonra bir hatayı yeniden göndermek için Error işlevini kullanın.

Başlangıç Yapmak

Basit bir örnekle başlayalım.

  1. Power Apps Canvas uygulamasında yeni bir ekran oluşturun.
  2. TextInput denetimi ekleyin. Varsayılan olarak TextInput1 adını kullanır.
  3. Label denetimi ekleyin.
  4. Label denetiminin Text özelliğini formüle ayarlayın
1/Value( TextInput1.Text )

'Metin girişi' içeren metin girişi denetimi için 'değer sayıya dönüştürülemez' ile görüntülenen hata başlığının ekran görüntüsü.

TextInput denetiminin "Text input"varsayılan metni sayıya dönüştürülemediğinden bir hata görürsünüz. Varsayılan olarak bu iyi bir şeydir: son kullanıcı uygulamada bir şeyin beklendiği gibi çalışmadığını belirten bir bildirim alır.

Açıkçası, bu uygulamayı her başlattığında kullanıcıyı selamlayan bir hata olmasını istemezsiniz. Büyük olasılıkla "Text input" metin giriş kutusu için doğru varsayılan değildir. Bu sorunu düzeltmek için TextInput denetiminin Default özelliğini şu şekilde değiştirin:

Blank()

'Sıfıra bölme' hatası ile görüntülenen hata mesajının ekran görüntüsü.

Şimdi farklı bir hata görüyorsunuz. Boş değer içeren bölme gibi matematiksel işlemler, boş değeri sıfıra dönüştürür. Bu değer sıfıra bölme hatasına neden olur. Bu sorunu çözmek için bu uygulamadaki bu durum için uygun davranışın ne olduğuna karar vermeniz gerekir. Yanıt, metin girişi boş olduğunda boş göstermek olabilir. Formülünüzü IfError işleviyle kaydırarak bu hedefi gerçekleştirebilirsiniz:

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

Hiçbir hata başlığının görüntülenmediğini, boş değerden kaynaklanan bir hatanın boş değerle değiştirildiğini gösteren ekran görüntüsü.

Şimdi hata geçerli bir değerle değiştirilir ve hata başlığı kaybolur. Ancak, hata yapmış olabilirsiniz; kullandığınız IfError girdiğiniz hatalı bir değer yazmak da dahil olmak üzere "hello" hataları kapsar. IfError'ınızı yalnızca sıfıra bölme durumunu işlemek için ayarlayarak ve diğer tüm hataları yeniden oluşturarak bu sorunu çözebilirsiniz.

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

Hata başlığının görüntülenmediğini, özellikle sıfıra bölme nedeniyle bir hatanın boş bir hatayla değiştirildiğini, aksi takdirde hatanın yeniden atıldığını gösteren ekran görüntüsü.

Bu nedenle uygulamanızı çalıştırın ve farklı değerler deneyin.

Herhangi bir değer olmadan, uygulama başladığında olduğu gibi, varsayılan değer boş olduğu için görüntülenen bir yanıt yoktur, ancak IfError sıfıra bölme hatasının yerini aldığı için bir hata da görüntülenmez.

Yanıtın görüntülenmediği ve hata başlığının gösterilmediği ekran görüntüsü.

4 yazarsanız beklenen 0,25 sonucunu alırsınız:

0,25'in görüntülendiğini ve hata başlığı olmadığını gösteren ekran görüntüsü.

Ve gibi hellogeçersiz bir şey yazarsanız bir hata başlığı alırsınız:

'Hello' değerinin bir sayıya dönüştürülememesi nedeniyle değer gösterilmeyen ve hata başlığının gösterildiği ekran görüntüsü.

Bu, basit bir tanıtıcı örnektir. Uygulamanın gereksinimlerine bağlı olarak hataları birçok farklı şekilde işleyebilirsiniz:

  1. Hata başlığı yerine, formülle etiket denetiminde "#Error" gösterebilirsiniz. Değiştirme türlerini IfError'ın ilk bağımsız değişkeniyle uyumlu tutmak için, Text işlevini kullanarak sayısal sonucu açıkça bir metin dizesine dönüştürmeniz gerekir.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Sonuç olarak hata başlığının gösterilmediği ve bunun yerine #Error gösterildiği ekran görüntüsü.
  2. Bu belirli örneği IfError ile sarmalamak yerine merkezi bir App.OnError işleyicisi yazabilirsiniz. Hata zaten oluştuğundan ve App.OnError yalnızca raporlamayı denetlemek için sağlandığından gösterilen dizeyi "#Error" ile değiştiremezsiniz.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Hataların yayılması

Hatalar Excel'de olduğu gibi formüller üzerinden akar. Örneğin, Excel'de hücre A1 formülüne =1/0sahipse, A1 hata değerini #DIV0!görüntüler:

A1=1/0 ve hücrede #DIV/0! gösterilen Excel elektronik tablosunun ekran görüntüsü.

Hücre A2 gibi A1bir formüle =A1*2 başvuruyorsa, hata bu formüle de yayılır:

Excel tablo ekran görüntüsü, A2=A1*2 ve #DIV/0! hücrede gösterilir.

Hata, formülün hesaplayacağı değerin yerini alır. A2 hücresindeki çarpma işleminin bir sonucu yoktur, yalnızca A1'deki bölme işleminden kaynaklanan hata vardır.

Power Fx aynı şekilde çalışır. Genel olarak, bir işlev veya işleç için bağımsız değişken olarak bir hata sağlarsanız, işlem gerçekleşmez. Giriş hatası, işlemin bir parçası olarak iletilir. Örneğin, Mid( Text( 1/0 ), 1, 1 ) en iç hata Text işlevinden ve Mid işlevinden geçtiğinden Sıfıra Bölme hatası döndürür:

Geçersiz işlemi gösteren hata başlığının ekran görüntüsü: sıfıra bölme.

Genel olarak hatalar Power Apps denetim özellikleri üzerinden akmaz. İlk etiketin Text özelliği hata durumu olduğunda görüntülenen başka bir denetim ekleyerek önceki örneği genişletelim.

İkinci etiket denetiminde hata olmadığını gösteren ekran görüntüsü.

Sistem tüm denetim özelliklerine girişte hatalar gözlemlediği için hataların bir denetim aracılığıyla yayılmamalarında bir sorun yoktur. Hata kaybolmaz.

Çoğu işlev ve işleçler "hata girişi, hata çıkışı" kuralını izler, ancak bazı istisnalar vardır. IsError, IsErrorOrBlank ve IfError işlevleri hatalarla çalışmak için tasarlanmıştır, bu nedenle bunlara geçirilse bile hata döndürmeyebilirler.

Hataları gözlemleme

Formül hata değerini kullanana kadar Power Fx hataları gözlemlemez.

Sonuç olarak, Eğer ve Seç işlevleri geçirilirse hata döndürmeyebilir. If( false, 1/0, 3 ) formülünü dikkate alın. Bu formülde sıfıra bölme hatası var, ancak If işlevi, false koşulu nedeniyle bu dalı izlemediğinden Power Fx ve Power Apps hata bildirmiyor.

Etiketin Metin özelliğinde If fonksiyonu ile hata başlığı gösterilmediğini gösteren ekran görüntüsü.

Set işlevinin hatayla kullanılması, hatanın değişkene yerleştirildiği noktada hata bildirmez. Örneğin Power Apps App.OnStart içinde x değişkenine sıfıra bölme hatası veren bir formül aşağıda verilmişti:

App.OnStart'ta İşlev çağrısını ayarla ile hiçbir hata başlığının gösterilmediği ekran görüntüsü.

x'e başvurulmadığı için hata bildirilmez. Ancak, bir etiket denetimi ekleyip Text özelliğini xolarak ayarladığınız anda hata görüntülenir:

x değişkenine başvuran etiket denetimiyle gösterilen hata başlığını gösteren ekran görüntüsü.

IfError, IsError ve IsErrorOrBlank işlevlerini kullanarak formül içindeki hataları gözlemleyebilirsiniz. Bu işlevleri kullanarak alternatif bir değer döndürebilir, alternatif eylemde bulunabilir veya hata gözlemlenmeden ve bildirilmeden önce hatayı değiştirebilirsiniz.

Hataları raporlama

Power Fx bir hata gözlemledikten sonra sonraki adım hatayı son kullanıcıya bildirmektir.

Excel'den farklı olarak, bir formülün sonucu, bir denetimin X ve Y koordinatları gibi bir özelliği yönlendirebileceğinden, hata sonucunu göstermek için her zaman uygun bir yer bulunmayabilir. Her Power Fx ana bilgisayarı, hataların son kullanıcıya nasıl gösterildiğini ve üreticinin bu işlem üzerinde ne kadar denetime sahibi olduğunu denetler. Power Apps'te, bir hata başlığı gösterilir ve App.OnError hatanın nasıl bildirildiğini denetlemek için kullanılır.

App.OnError'ın hatayı IfError ile aynı şekilde değiştiremeyeceği dikkate alınmalıdır. App.OnError yürütülürken hata zaten oluştu ve sonuç diğer formüller aracılığıyla yayılır. App.OnError yalnızca hatanın son kullanıcıya nasıl bildirildiğini denetler ve istenirse oluşturucunun hatayı günlüğe kaydetmesi için bir kanca sağlar.

Kapsam değişkenleri FirstError ve AllErrors hata veya hatalar hakkında kapsam bilgileri sağlar. Bu bağlam hatanın türü, hatanın nereden kaynaklandığı ve nerede gözlemlendiği hakkında bilgi sağlar.

Hata sonrası durdurma

Davranış formülleri harekete geçmeyi, veritabanlarını değiştirmeyi ve durum değiştirmeyi destekler. Bu formüller, zincirleme işleci kullanılarak ; (veya ;; yerel ayara bağlı olarak) bir dizide birden fazla eylem yapılmasını sağlar.

Örneğin, bu durumda kılavuz denetimi, T tablosunda ne olduğunu gösterir. Her düğme seçimi iki Yama çağrısı ile bu tablodaki durumu değiştirir:

T tablosundaki iki kaydın her düğmeye tıkladıktan sonra rastgele sayılarla güncelleştirilmesini gösteren animasyonun ekran görüntüsü.

Zincirleme davranış formülünde, eylemler ilk hatadan sonra durmaz. Örneğimizi, ilk Patch çağrısında geçersiz bir dizin numarası iletecek şekilde değiştirelim. İkinci Yama bu önceki hataya rağmen devam ediyor. İlk hata son kullanıcıya bildirilir ve denetim üzerinde Studio'da bir hata olarak gösterilir:

T tablosundaki yalnızca ikinci kaydın her düğmeye tıkladıktan sonra rastgele sayılarla güncelleştirilmesini ve hataya neden olan ilk kaydı gösteren animasyonun ekran görüntüsü.

Bir hatadan sonra yürütmeyi durdurmak için IfError kullanın. If işlevine benzer olarak, bu işlevin üçüncü bağımsız değişkeni yalnızca hata yoksa yürütülmesi gereken eylemleri koymak için bir yer sağlar:

IfError ikinci işlemin hatadan sonra tamamlanmasını engellediğinden, T tablosundaki her iki kayıtta da değişiklik yapılmadığını gösteren animasyonun ekran görüntüsü.

ForAll yinelemelerinden biri sırasında bir hatayla karşılaşırsanız, yinelemelerin geri kalanı durmaz. ForAll , her yinelemeyi bağımsız olarak yürütmek ve paralel yürütmeye izin vermek üzere tasarlanmıştır. ForAll tamamlandığında, karşılaşılan tüm hataları içeren bir hata döndürülür (IfError veya App.OnError'daAllError incelenerek).

Örneğin, aşağıdaki formül, ForAll'un iki hata döndürmesine (Value'in sıfıra bölünmesi yüzünden iki kez) ve Collection üç kayda (Value 0 değilse) ulaşmasına neden olur: [1, 2, 3].

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

Birden çok hata ile çalışma

Bir davranış formülü birden çok eylem yürütebileceğinden, birden çok hatayla de karşılaşabilir.

Varsayılan olarak, uygulama ilk hatayı son kullanıcıya bildirir. Bu örnekte her iki Patch çağrısı da başarısız olur, ancak ikinci çağrı sıfıra bölme hatasıyla başarısız olur. Kullanıcı yalnızca dizinle ilgili ilk hatayı görür:

Hata başlığında görüntülenen ilk dizin hatasının ekran görüntüsü, ikinci hata bildirilmiyor.

IfError işlevi ve App.OnError, AllErrors kapsam değişkenini kullanarak karşılaşılan tüm hatalara erişebilir. Bu durumda, bu değişkeni genel değişken olarak ayarlayabilir ve karşılaşılan her iki hataya da bakabilirsiniz. Bunlar, tabloda karşılaşıldıkları sıraya göre yer alır.

Her iki hatanın da mevcut olduğunu görebildiğimiz PatchErrors genel değişkeninde hataların yakalanmasının ekran görüntüsü.

Davranışsız formüller de birden çok hata döndürebilir. Örneğin Patch işlevinin güncellenecek bir yığın kayıtla kullanılması, başarısız olan her kayıt için bir tane olmak üzere birden fazla hata döndürebilir.

Tablolarda hatalar var

Daha önce gördüğünüz gibi, hataları değişkenlerde depolayabilirsiniz. Tablolar gibi veri yapılarına da hatalar ekleyebilirsiniz. Bu yaklaşım, herhangi bir kayıtta hatanın tablonun tamamını geçersiz kılmamasını sağladığından önemlidir.

Örneğin, Power Apps'teki bu veri tablosu denetimini göz önünde bulundurun:

0 girişi için Karşılıklı alanının hatasını gösteren ve sıfıra bölme hatasıyla sonuçlanan veri tablosunun ekran görüntüsü.

AddColumns'daki hesaplama, değerlerden biri için sıfıra bölme hatasıyla karşılaştı. Bu tek kayıt için Karşılıklı sütununda bir hata değeri (sıfıra bölme) var ancak diğer kayıtlarda mevcut değil ve sorun yok. IsError( Index( output, 2 ) ) Yanlış döndürür ve IsError( Index( output, 2 ).Value ) doğru döndürür.

Tablo filtrelendiğinde bir hata oluşursa, kaydın tamamı bir hatadır. İşlem yine de sonuçtaki kaydı döndürerek son kullanıcının orada bir şey olduğunu ve bir sorun olduğunu bilmesine neden olur.

Bu örneği alın. Burada orijinal tabloda hiç hata yoktur, ancak Değer 0'a eşit olduğunda filtreleme işlemi bir hata oluşturur:

Filtre ölçütü tarafından işlenemeyen iki kayıt için hataları gösteren veri tablosunun ekran görüntüsü.

-5 ve -3 değerleri doğru şekilde filtrelenir. 0 değerleri, filtrenin işlenmesinde hata oluşmasına neden olur ve bu nedenle kaydın sonuca dahil edilip edilmeyeceği belirsizdir. Son kullanıcılar için saydamlığı en üst düzeye çıkarmak ve oluşturucuların hata ayıklamasına yardımcı olmak için, işleyiş orijinalin yerine bir hata kaydı içerir. Bu durumda, IsError( Index( output, 2 ) ) true değerini döndürür.

Veri kaynağı hataları

Patch, Collect, Remove, RemoveIf, Update, UpdateIf ve SubmitForm gibi veri kaynaklarındaki verileri değiştirebilen işlevler iki şekilde hata verir:

  • Bu işlevlerin her biri işlemin sonucu olarak bir hata değeri döndürür. IsError kullanarak hataları algılayabilir ve her zamanki gibi IfError ve App.OnError kullanarak hataları değiştirebilir veya gizleyebilirsiniz.
  • İşlemden sonra Errors işlevi, önceki işlemler için hataları da döndürür. Bu davranış, bir durum değişkenindeki hatayı yakalamaya gerek kalmadan bir form ekranında hata iletisini görüntülemek için yararlı olabilir.

Örneğin, bu formül Topla'dan gelen bir hatayı denetler ve özel bir hata iletisi görüntüler:

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

Errors işlevi çalışma zamanı işlemleri sırasında geçmişteki hatalar hakkında bilgi de döndürür. Bu, hatayı bir durum değişkeninde yakalamak zorunda kalmadan, bir hatayı bir form ekranında görüntülemeye yarayabilir.

Hataları yeniden atma

Bazen olası hataları bekler ve güvenle gözardı edebilirsiniz. IfError ve App.OnError içinde, bir sonraki üst işleyiciye iletilmesi gereken bir hata algılanırsa, Error( AllErrors ) kullanarak yeniden fırlatın.

Kendi hatalarınızı oluşturma

Error işlevini kullanarak kendi hatalarınızı da oluşturabilirsiniz.

Kendi hatalarınızı oluşturursanız, gelecekteki sistem hata değerleriyle olası çakışmaları önlemek için 1.000'den büyük değerleri kullanın.

ErrorKind numaralandırma değerleri

ErrorKind sabit listesi Değer Description
Analiz Hatası 18 Sistem hatası. Derleyici analiziyle ilgili bir sorun var.
Geçersiz Dil Kodu 14 Geçersiz veya tanınmayan bir dil kodu kullanıldı.
BadRegex 15 Geçersiz düzenli ifade. IsMatch, Match veya MatchAll işlevleri ile kullanılan sözdizimini kontrol edin.
Conflict 6 Güncelleştirdiğiniz kayıt kaynakta zaten değiştirildi ve çakışmayı çözmeniz gerekiyor. Yerel değişiklikleri kaydetmek, kaydı yenilemek ve değişiklikleri yeniden uygulamak genel bir çözümdür.
Kısıtlama İhlali 8 Kayıt, sunucuda bir kısıtlama denetiminden geçmedi.
İzinOluştur 3 Veri kaynağı için kayıt oluşturma izniniz yok. Örneğin Collect işlevi çağrıldı.
İzinleriSil 5 Veri kaynağı için bir kaydı silme izniniz yok. Örneğin Remove işlevi çağrıldı.
Div0 13 (on üç) Sıfıra bölme.
Düzenleme İzinleri 4 Veri kaynağı için kayıt oluşturma izniniz yok. Örneğin Patch işlevi çağrıldı.
GeneratedValue 9 Sunucunun otomatik olarak hesaplandığı bir alan için sunucuya hatalı bir şekilde bir değer geçirildi.
GeçersizFonksiyonKullanımı 16 Geçersiz işlev kullanımı. Çoğu zaman fonksiyonun bir veya daha fazla bağımsız değişkeni yanlıştır veya geçersiz bir şekilde kullanılmaktadır.
DosyaBulunamadı 17 SaveData depolama alanı bulunamadı.
Yetersiz Bellek 21 Cihazda işlem için yeterli bellek veya depolama alanı yok.
GeçersizArgüman Yirmi beş Geçersiz bağımsız değişken işleve geçirildi.
İç 26 Sistem hatası. İşlevlerden biriyle ilgili bir iç sorun var.
GerekliEksik 2 Kaydın gerekli bir alanı eksik.
23 Ağ iletişimleriyle ilgili bir sorun var.
Hiçbiri 0 Sistem hatası. Hata yoktur.
Uygulanamaz 27 Kullanılabilir değer yok. Bu hata, sayısal hesaplamalarda sıfır olarak ele alınabilecek boş bir değeri, değer kullanılırsa olası bir sorun olarak işaretlenmesi gereken boş değerlerden ayırmak için yararlıdır.
Bulunamadı 7 Kayıt bulunamadı. Örneğin Patch işlevinde değiştirilecek kayıt.
Desteklenmiyor 20 İşlem bu oyuncu veya cihaz tarafından desteklenmiyor.
Sayısal yirmi dört Sayısal bir işlev uygunsuz bir şekilde kullanıldı. Örneğin, -1 ile Sqrt.
Kota Aşıldı 22 Depolama kotası aşıldı.
ReadOnlyValue 10 Sütun salt okunurdur ve değiştirilemez.
Okuma İzni 19 Veri kaynağı için kayıtları okuma izniniz yok.
Zaman Uyumlu 1 Veri kaynağı bir hata bildirdi. Daha fazla bilgi için İleti sütununu kontrol edin.
Bilinmiyor 12 Bilinmeyen türde bir hata oluşmuştur.
Validation 11 Kayıt bir doğrulama denetiminden geçmedi.