Aracılığıyla paylaş


Hata işleme

Not

Bu makalede açıklanan davranış, yalnızca Ayarlar>Yaklaşan Özellikler>Önizleme aracılığıyla Formül düzeyinde hata yönetimi önizleme özelliği etkinleştirildiğinde kullanılabilir. Daha fazla bilgi: Hangi özelliklerin etkin olduğunu 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ı beklenmedik bir şey olduğunu bilir ve sorunu farklı bir girdi ile kendisi çözebilir ya da sorunu uygulamanın sahibine bildirebilir.

Uygulama oluşturucu olarak, uygulamanızda hata denetimi alabilirsiniz:

  • Bir hatanın algılanması ve işlenmesi. Bir hata oluşma ihtimali varsa uygulamanın formülleri hata durumunu tespit edecek ve işlemi yeniden deneyecek şekilde yazabilir. Son kullanıcının, üretici bu sorumluluğu dikkate aldığı için bir hata oluştuğu konusunda endişelenmesine gerek yoktur. Bu, bir formül içindeki IfError, IsError ve IsErrorOrBlank işlevleriyle yapılır.
  • Bir hata raporlama. Bir hata, karşılaşıldığı formülde işlenmezse hata App.OnError işleyicisine aktarılır. Burada, hata zaten oluştuğu ve formül hesaplamalarının bir parçası olduğu için hata artık değiştirilemez. 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 yeniden atma. Son olarak, uygulamanıza özgü bir koşulunu kendi mantığınızla bir hata koşulu olarak algılayabilirsiniz. Özel hatalar oluşturmak için Error işlevini kullanın. Error işlevi IfError veya App.OnError içinde sorgulandıktan sonra bir hatayı yeniden atmak için de kullanılır.

Kullanmaya başlama

Basit bir örnekle başlayalım.

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

TextInput denetiminin varsayılan metni, sayıya dönüştürülemeyen "Text input" olduğu için bir hata alıyoruz. Varsayılan olarak bu iyi bir seçimdir: Son Kullanıcı, uygulamada beklendiği gibi çalışmadığını bildiren bir bildirim alır.

Açıkçası, kullanıcının bu uygulamayı her başlattığında hatayla karşılaşmasını istemiyoruz. Büyük olasılıkla "Text input" metin giriş kutusu için doğru varsayılan değildir. Bunu düzeltmek için TextInput denetiminin Default özelliğini şu şekilde değiştirelim:

Blank()

Hmm, şimdi farklı bir hata oluştu. Bölme gibi boşluk içeren matematiksel işlemler, boş değeri sıfıra döndürür. Şimdi de bu, sıfıra bölme hatasına yol açıyor. Bunu düzeltmek için uygulamadaki bu durum için uygun davranışın ne olduğuna karar vermemiz gerekir. Yanıt, metin girişi boş olduğunda boş göstermek olabilir. Bunu, formülümüzü IfError işleviyle paketleyerek gerçekleştirebiliriz:

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

Hata başlığı görüntülenemiyor; boş bir değer nedeniyle oluşan hata bir boşluk ile değiştirildi

Şimdi hata geçerli bir değer olarak değiştirilir ve hata başlığı ortadan kaldırılır. Ancak değeri aşmış olabiliriz: kullandığımız IfError, "hello" gibi kötü bir değer da dahil olmak üzere tüm hataları kapsar. Bunu, IfError'i yalnızca sıfıra bölme durumunu ele alacak ve diğer tüm hataları yeniden oluşturacak şekilde ayarlayarak çözebiliriz:

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

Hata başlığı görüntülenmiyor, özellikle sıfıra bölme için bir hata oluştuğundan hata başka bir deyişle yeniden yaratılır

Bu nedenle, uygulamamızı çalıştıralım ve bazı farklı değerler deneyelim.

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.

Hiçbir yanıt görüntülenmedi ve hata başlığı yok

4 yazmamız durumunda, beklenen sonuç olan 0,25'i elde ederiz:

0.25 görüntülendi ve hata başlığı yok

hello gibi yasadışı bir şey yazarsak bir hata başlığı alırız:

Bu, basit bir tanıtıcı örnektir. Hata işleme uygulamanın ihtiyaçlarına bağlı olarak birçok farklı şekilde yapılabilir:

  1. Bir hata başlığı yerine, etiket denetimi içinde "#Error" ifadesi gösterebildik. Değiştirmelerin türlerini IfError işlevinin ilk bağımsız değişkeniyle uyumlu tutmak için sayısal sonucu Text işleviyle açıkça bir metin dizesine dönüştürmemiz gerekir.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    hata başlığı yok ve bunun yerine #Error sonuç olarak gösterilir
  2. Bu özel örneği IfError ile paketlemek yerine merkezi bir App.OnError işleyicisi yazabilirdik. Hata zaten oluştuğundan ve App.OnError yalnızca raporlama denetimi için sağlanmış olduğundan, "#Error" ile gösterilen dizeyi değiştiremiyoruz.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Hata yayma

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

A1=1/0 ve #DIV/0! hücrede gösterilen Excel elektronik tablosu

A2 hücresi, =A1*2 gibi bir formülle A1'ye başvurursa hata bu formül aracılığıyla da yayılır:

A2=A1*2 ve #DIV/0! hücrede gösterilen Excel elektronik tablosu

Hata aksi takdirde hesaplanacak olan 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şlece bağımsız değişken olarak bir hata sağlanırsa işlem gerçekleşmez ve giriş hatası işlemin sonucu olarak akar. Örneğin Mid( Text( 1/0 ), 1, 1 ) Sıfıra Bölme hatası döndürür, çünkü en içteki hata Text işlevi ve Mid işlevinden geçer:

Geçersiz işlemi gösteren hata başlığı: sıfıra bölme

Genel olarak hatalar Power Apps denetim özellikleri üzerinden akmaz. Önceki örneği, ilk etiketin Text özelliğinin hata durumu olup olmadığını gösteren ek bir denetimle genişletelim:

İkinci etiket denetiminde hata gösterilmiyor

Sistem, tüm denetim özelliklerinin girişindeki hataları gözlemleyeceğinden, hataları denetim ile yaymak uygundur. 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 içlerine bir hata aktarılsa bile hata döndürmeyebilirler.

Hataları gözlemleme

Bu hatalar, değerleri kullanılıncaya kadar dikkate alınmaz.

Sonuç olarak If ve Select işlevleri, bir hata iletilmesi durumunda da hata döndürmeyebilir. If( false, 1/0, 3 ) formülünü dikkate alın. Bu formülde sıfıra bölme hatası vardır ancak If, false olduğu için bu dalı almadığından, Power Fx ve Power Apps bir hata bildirmez:

Etiket Metin özelliğindeki If işlevinde gösterilen bir hata başlığı yok

Set işlevini bir hatayla kullanmak, hatanın değişkene yerleştirildiği noktada bir hata bildirmez. Örneğin Power Apps'te x değişkenine sıfıra bölme hatası yerleştiren App.OnStart içinde formül şudur:

App.OnStart içinde Set işlev çağrısıyla gösterilen hata başlığı yok

x'e başvurulmadığı için hata bildirilmez. Ancak bir etiket denetimi ekleyip Text özelliğini x olarak ayarladığımızda hata görüntülenir:

x değişkenine başvuran etiket denetimi ile gösterilen hata başlığı

IfError, IsError ve IsErrorOrBlank işlevlerine sahip bir formül içindeki hataları gözlemleyebilirsiniz. Bu işlevlerle, alternatif bir değer döndürebilir, alternatif eylem gerçekleştirebilir veya hatayı gözlemleyip raporlanmadan önce değiştirebilirsiniz.

Hatları raporlama

Bir hata gözlemlendikten sonra, sonraki adım hatayı son kullanıcıya bildirmek olur.

Excel'den farklı olarak, bir formülün sonucu bazı metinleri göstermek için uygun yeri olmayan bir denetimin X ve Y koordinatları gibi bir özelliği sürebileceğinden, her zaman uygun bir yer yoktur. 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 başlatıldığında hata zaten oluşmuş ve sonuç, diğer formüller aracılığıyla yayılmıştı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, hatanın türü ve hatanın nereden kaynaklandığı ve nerede gözlemlendiği hakkında bilgi sağlar.

Bir hatadan sonra durdurma

Davranış formülleri harekete geçmeyi, veritabanlarını değiştirmeyi ve durum değiştirmeyi destekler. Bu formüller ; zincirleme işleci (veya yerel ayara bağlı olarak ;;) kullanarak bir sırada birden fazla eylemin yapılmasına izin verir.

Bu durumda, örneğin 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, düğmeye her tıklamadan sonra rastgele sayılarla güncellendiğini gösteren animasyon

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

T tablosundaki yalnızca ikinci kaydın düğmeye her tıklandıktan sonra rastgele sayılarla güncellendiğini ve ilk kaydın bir hatayla sonuçlandığını gösteren animasyon

IfError , bir hatadan sonra yürütmeyi durdurmak için kullanılabilir. 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 bir hatadan sonra ikinci işlemin tamamlanmasını engellediği için T tablosundaki hiçbir kayıtta değişiklik olmadığını gösteren animasyon

ForAll öğelerinin biri sırasında hatayla karşılaşılırsa öğelerin 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 hataların tümünü içeren (IfError veya App.OnError içinde AllErrors incelenerek) bir hata döndürülür.

Örneğin aşağıdaki formül, iki hata ForAll'un iki hata döndürmesiyle (0'da Value için sıfıra bölme, iki kez) ve Collection'ın üç kaydı olur (Value 0 olmadığında): [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, ilk hata son kullanıcıya bildirilir. Bu örnekte, her iki Yama çağrısı başarısız olur; ikinci olarak sıfıra bölme hatası mevcuttur. Kullanıcıya yalnızca ilk hata (dizin hakkında) gösterilir:

İlk dizin hatası bir hata başlığında görüntüleniyor; ikinci hata bildirilmedi

IfError işlevi ve App.OnError, AllErrors kapsam değişkeni ile karşılaşılan hataların tümüne erişebilir. Bu durumda, bunu genel bir değişken olarak ayarlayabilir ve karşılaşılan her iki hataya da bakabiliriz. Bunlar, tabloda karşılaşıldıkları sıraya göre yer alır.

Hataları, mevcut her iki hatayı da görebildiğimiz genel değişken PatchErrors içinde yakalayın

Birden çok hata, davranış dışı formüllerde de döndürülebilir. Ö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 de gördüğümüz hatalar, değişkenlerde saklanabilir. Hatalar, tablolar gibi veri yapılarında da bulunabilir. Bu, herhangi bir kayıttaki hatanın tüm tabloyu geçersiz kılmaması için önemlidir.

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

Sıfıra bölme hatasıyla sonuçlanan bir 0 girişinin Devrik alanı için bir hata gösteren veri tablosu

AddColumns'ta 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.

Bir tabloya filtrelerken bir hata oluşursa tüm kayıt bir hatadır ancak yine de sonuçta döndürülür ve böylece son kullanıcı orada bir şey olduğu ve bir sorun olduğunu bilir.

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 kriterleri tarafından işlenemeyen iki kayıt için hataları gösteren veri tablosu

-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 şeffaflığı en üst düzeye çıkarmak ve üreticilerin hata ayıklamasına yardımcı olmak amacıyla orijinalin yerine bir hata kaydı ekliyoruz. 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. Hatalar IsError ile saptanabilir ve her zamanki gibi IfError ve App.OnError ile değiştirilebilir veya baskılanabilir.
  • İşlemden sonra, Errors işlevi önceki işlemlerin hatalarını da döndürür. Bu, hatayı bir durum değişkeninde yakalamak zorunda kalmadan, hata iletisini bir form ekranında görüntülemeye yarayabilir.

Örneğin bu formül bir hatayı Collect işlevinden kaynaklanan bir hata olup olmadığını kontrol eder 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ı bazı hatalar beklenir ve bu da güvenle yok sayılabilir. IfError ve App.OnError içinde, bir sonraki üst işleyiciye aktarılması gereken bir hata tespit edilirse Error( AllErrors ) ile yeniden atılabilir.

Kendi hatalarınızı oluşturma

Ayrıca, Error işleviyle kendi hatalarınızı da oluşturabilirsiniz.

Kendi hatalarınızı oluşturuyorsanız gelecekteki sistem hata değerleriyle olası çakışmaları önlemek için 1000 üzerindeki değerleri kullanmanız önerilir.

ErrorKind sabit listesi değerleri

ErrorKind sabit listesi Değer Veri Akışı Açıklaması
AnalysisError 18 Sistem hatası. Derleyici analizi ile ilgili bir sorun oluştu.
BadLanguageCode 14 Geçersiz veya tanınmayan bir dil kodu kullanıldı.
BadRegex 15 Geçersiz normal ifade. IsMatch, Match veya MatchAll işlevleri ile kullanılan sözdizimini kontrol edin.
Çakışma 6 Güncelleştirilmekte olan kayıt kaynakta zaten değiştirilmiştir ve çakışmanın çözülmesi gerekir. Yerel değişiklikleri kaydetmek, kaydı yenilemek ve değişiklikleri yeniden uygulamak genel bir çözümdür.
ConstraintViolated 8 Kayıt, sunucuda bir kısıtlama denetiminden geçmedi.
CreatePermission 3 Kullanıcının veri kaynağı için kayıt oluşturma izni yok. Örneğin Collect işlevi çağrıldı.
DeletePermissions 5 Kullanıcının veri kaynağı için kayıt silme izni yok. Örneğin Remove işlevi çağrıldı.
Div0 13 Sıfıra bölme.
EditPermissions 4 Kullanıcının veri kaynağı için kayıt oluşturma izni yok. Örneğin Patch işlevi çağrıldı.
GeneratedValue 9 Sunucu tarafından otomatik olarak hesaplanan bir alan için sunucuya bir değer aktarıldı.
InvalidFunctionUsage 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.
FileNotFound 17 SaveData depolama alanı bulunamadı.
InsufficientMemory 21 İşlem için cihazda yeterli bellek veya depolama alanı yok.
InvalidArgument 25 Geçersiz bağımsız değişken işleve geçirildi.
Şirket İçi 26 Sistem hatası. İşlevlerden biriyle ilgili dahili bir sorun vardı.
MissingRequired 2 Bir kaydın gerekli alanı eksikti.
23 Ağ iletişimleriyle ilgili bir sorun oluştu.
None 0 Sistem hatası. Hata yoktur.
Uygulanamaz 27 Kullanılabilir değer yok. Değer kullanılırsa olası bir sorun olarak işaretlenmesi gereken boş değerlerden sayısal hesaplamalarda sıfır olarak kabul edilen boş değeri ayırt etmek için kullanışlıdır.
NotFound 7 Kayıt bulunamadı. Örneğin Patch işlevinde değiştirilecek kayıt.
NotSupported 20 İşlem bu oyuncu veya cihaz tarafından desteklenmiyor.
Sayısal 24 Sayısal bir işlev uygunsuz bir şekilde kullanıldı. Örneğin, -1 ile Sqrt.
QuoteExceeded 22 Depolama kotası aşıldı.
ReadOnlyValue 10 Sütun salt okunurdur ve değiştirilemez.
ReadPermission 19 Kullanıcının veri kaynağı için kayıt okuma izni yok.
Eşitleme Kategori 1 Veri kaynağı tarafından bir hata bildirilmiştir. Daha fazla bilgi için İleti sütununu kontrol edin.
Bilinmiyor 12 Bilinmeyen türde bir hata oluşmuştur.
Doğrulama 11 Kayıt bir doğrulama denetiminden geçmedi.