Ana içeriğe geç
Kesit Power BI
İleri · Veri Hazırlama

M’de hata yönetimi: try, otherwise, catch, error, hata hücreleri

Adım hatası ve hücre hatası, try sonuç kaydı, otherwise ve catch, error ile kendi hatanı üretmek, hata günlüğü sorgusu, try’ın yakalamadığı ertelenmiş hata.

Uygulamada aç, 11 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

İki tür hata

TürÖrnekDavranış
Adım düzeyiOlmayan sütun, olmayan dosyaSorgu durur, sonuç yok
Hücre düzeyiMetni sayıya çevirme, null ile ifSatı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]]
Belgede küçük bir tutarsızlıkM dil belirtimi anlatımda 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

DurumYöntem
Bilinen, zararsız değer (“-”, “yok”)Tür öncesi Replace Values ile null
Az sayıda bozuk satır ve kaynak düzeltilemiyortry ... otherwise null ve hata günlüğü sorgusu
İş kuralı bozulduerror 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
Alıştırmalara geç (11)