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.
- Power Apps Tuval uygulamasında yeni bir ekran oluşturun.
- TextInput denetimi ekleyin. Varsayılan olarak TextInput1 adını alır.
- Label denetimi ekleyin.
- 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() )
Ş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 ) ) )
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.
4 yazmamız durumunda, beklenen sonuç olan 0,25'i elde ederiz:
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:
- 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" )
- 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:
A2
hücresi, =A1*2
gibi bir formülle A1
'ye başvurursa hata bu formül aracılığıyla da yayılır:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.
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:
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:
-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. |
Ağ | 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. |