İki tür hata
| Tür | Örnek | Davranış |
|---|---|---|
| Adım düzeyi | Olmayan sütun, olmayan dosya | Sorgu durur, sonuç yok |
| Hücre düzeyi | Metni sayıya çevirme, null ile if | Satır kalır, hücre Error olur. Yüklemede satır hatası sayılır. |
try
try x kayıt döndürür: başarılıysa [HasError = false, Value = x], değilse [HasError = true, Error = hata]. Hata da bir kayıttır: Reason, Message, Detail.
let
Iyi = try 1 + 1,
Kotu = try "a" + 1
in
[Iyi = Iyi[Value], Mesaj = Kotu[Error][Message], Neden = Kotu[Error][Reason]]
HasErrors yazar, aynı sayfadaki örnekler x[HasError] kullanır. Biz örnekleri izledik.otherwise ve catch
try x otherwise y hatada y döndürür. Hepsini tek değere bağlamak en kısa yoldur ama nedeni kaybettirir. catch (e) => ... hata kaydını da verir:
let
Ham = #table({"Kod", "Tutar"}, {{"A", "120"}, {"B", "yok"}, {"C", "75"}}),
Sayi = Table.AddColumn(Ham, "Sayi", each try Number.From([Tutar]) otherwise null, type number),
Neden = Table.AddColumn(Sayi, "Neden", each try Number.From([Tutar]) catch (e) => e[Reason])
in
Neden
error: kendi hatanı üret
Bir iş kuralı bozulduğunda sessizce devam etmek yerine hata üret: error "metin", error Error.Record("Neden", "Mesaj", ayrıntı). Beklenmeyen durumda durmak, yanlış raporu paylaşmaktan iyidir.
let
Kontrol = (t as table) as table =>
if Table.IsEmpty(t) then error Error.Record("VeriYok", "Tablo boş geldi", null) else t,
Sonuc = try Kontrol(Table.FirstN(Satislar, 0))
in
Sonuc[Error][Reason]
Hata satırlarını bulmak
Table.SelectRowsWithErrors yalnız hatalı satırları, Table.RemoveRowsWithErrors geri kalanını verir. Uygun desen: asıl sorgu temiz satırları yükler, ikinci sorgu hatalı satırları bir denetim sayfasına yükler. Hataları silmek toplamı sessizce küçültür; hangi satırların gittiğini izle.
let
Ham = #table({"Kod", "Tutar"}, {{"A", "120"}, {"B", "yok"}}),
Tipli = Table.TransformColumnTypes(Ham, {{"Tutar", type number}})
in
[Temiz = Table.RowCount(Table.RemoveRowsWithErrors(Tipli)), Hatali = Table.RowCount(Table.SelectRowsWithErrors(Tipli))]
Ertelenmiş hata tuzağı
M tembeldir: try yalnız o an değerlendirdiğini yakalar. Kayıt alanının içindeki hata, alan okununcaya kadar oluşmaz. Learn’deki örnek:
let
f = (x) => [a = error "bad", b = x],
g = try f(42) otherwise 123
in
g[a] // yine de error "bad"
Çözüm, hatayı olduğu yerde ele almak: alanın içinde try kullan.
Karar tablosu
| Durum | Yöntem |
|---|---|
| Bilinen, zararsız değer (“-”, “yok”) | Tür öncesi Replace Values ile null |
| Az sayıda bozuk satır ve kaynak düzeltilemiyor | try ... otherwise null ve hata günlüğü sorgusu |
| İş kuralı bozuldu | error ile dur |
| Az sayıda hücre hatası | Replace Errors değil, ayrı sütunda Neden. Hata toplamı etkiler: M’de List.Sum hata verir |