Uygulama yapısı

Hata Yönetimi

Fırlatılan, raporlanan ve uyarı olarak yazılan hataların ayrımı; MotifError, errorHandler, setUnexpectedErrorHandler ve safeCall yardımcıları.

MotifJS kullanıcı kodundan gelen hatayı yutmaz, ama uygulamayı da düşürmez. Çerçevenin fırlattığı, raporladığı ya da uyarı olarak yazdığı her durumun bir MJX kodu vardır ve bu durumlar üç yoldan birine girer. Bu bölüm o yolları, hataları dinleme noktalarını ve çerçevenin kendi hata-güvenli çağrı yardımcılarını anlatır. Kodların tam listesi Hata ve Uyarı Kodları tablosundadır.

Üç yol

Yol Ne zaman Nereye gider
Fırlatma Çağıranın hemen düzeltmesi gereken yanlış kullanım: adlandırılmış rota yok (MJX302), servis kayıtlı değil (MJX401), ikinci ApplicationBuilder (MJX405), Query.first() boş dizide (MJX601) … MotifError fırlatılır; try/catch ile yakalanır.
Rapor Akışı durdurmaması gereken kullanıcı kodu hatası: bileşen kancası (MJX122), olay işleyicisi (MJX123), effect/bağ (MJX208), rota kancası ve guard (MJX306), serbest bırakma ve veri yükleme hataları … errorHandler.report(MotifError): konsola console.error (app.useLogging(false) kapatır), errorHandler.addListener(fn) dinleyicilerine, varsa devtools veriyoluna. Asıl hata cause'dadır. Üretimde de çalışır.
Uyarı Çalışmaya devam eden ama büyük olasılıkla istenmeyen durum: yinelenen key (MJX202), kendini tetikleyen effect (MJX203), rota tanımı denetimi (MJX310–MJX316) … Yalnız geliştirme modunda (app.useDevelopment(true)) console.warn ve devtools uyarı listesi. Dinleyicilere gitmez.

MotifError

Çerçevenin fırlattığı ve raporladığı her hata MotifError'dur:

import { MotifError } from "@motifx/core";

try {
  await app.navigateByName("note", { id: note.id });
} catch (e) {
  if (e instanceof MotifError && e.code === 'MJX302') { /* adlandırılmış rota bulunamadı */ }
}
import { MotifError } from "@motifx/core";

try {
  await app.navigateByName("note", { id: note.id });
} catch (e) {
  if (e instanceof MotifError && e.code === 'MJX302') { /* adlandırılmış rota bulunamadı */ }
}
Alan Açıklama
code MotifErrorCode ('MJX302' gibi). Mesaj metnine değil buna göre dallanın; metinler İngilizcedir ve değişebilir.
message [motifjs] MJX302: … biçiminde İngilizce mesaj.
cause Raporlanan hatalarda asıl hata (kullanıcı kodunun fırlattığı değer).
name 'MotifError' (Resilience zaman aşımında 'TimeoutError').

MotifErrorCode tipi bütün kodların birleşimidir; switch (e.code) yazarken tamamlama sağlar.

Raporları dinleme — errorHandler

import { errorHandler } from "@motifx/core";

const off = errorHandler.addListener((error) => {
  navigator.sendBeacon("/api/errors", JSON.stringify({ code: error.code, message: error.message, cause: String(error.cause) }));
});
import { errorHandler } from "@motifx/core";

const off = errorHandler.addListener((error) => {
  navigator.sendBeacon("/api/errors", JSON.stringify({ code: error.code, message: error.message, cause: String(error.cause) }));
});

ErrorHandler sınıfının diğer üyeleri: setDevelopmentMode(b) / isDevelopment() (app.useDevelopment bunu kullanır), setConsoleLogging(b) (app.useLogging), reportSuppressed(context, err) (yalnız geliştirme modunda konsola yazar, dinleyicilere gitmez; çerçeve kendi içinde yuttuğu hatalar için kullanır), getUnexpectedErrorHandler().

Beklenmeyen hatalar — setUnexpectedErrorHandler

safeCall/safeCallAsync içinde yakalanan ve Emitter dinleyicilerinin fırlattığı hatalar kodsuzdur; bunlar errorHandler.onUnexpectedError(err) yoluna girer:

  1. setUnexpectedErrorHandler(fn) ile verilen işleyici çağrılır. Varsayılan işleyici hatayı setTimeout(…, 0) ile yeniden fırlatır: tarayıcıda window.onerror/unhandledrejection düzeyinde görünür, çağıran akış kesilmez.
  2. Ardından addListener dinleyicileri hatayı olduğu gibi alır.
import { setUnexpectedErrorHandler } from "@motifx/core";

setUnexpectedErrorHandler((error) => navigator.sendBeacon("/api/errors", String(error)));   // yeniden fırlatmak yerine sunucuya gönder
import { setUnexpectedErrorHandler } from "@motifx/core";

setUnexpectedErrorHandler((error) => navigator.sendBeacon("/api/errors", String(error)));   // yeniden fırlatmak yerine sunucuya gönder

Kodlu raporlar (MJX122 …) bu işleyiciye gitmez; onlar için addListener kullanın.

Hata-güvenli çağrı yardımcıları

Çerçevenin kendi kodunu sarmak için kullandığı yardımcılar dışa açıktır:

Fonksiyon Davranış
safeCall(fn, context, fallback?) fn()'i çağırır; fırlatırsa geliştirme modunda [motifjs Error - context] yazar, hatayı onUnexpectedError'a verir ve fallback'i (yoksa undefined) döndürür.
safeCallAsync(fn, context, fallback?) Aynı; fn Promise döndürür, reddedilme yakalanır.
safeCallSilent(fn, context) Fırlatırsa yalnız geliştirme modunda konsola yazar; onUnexpectedError'a ve dinleyicilere gitmez.
errorHandler.safeCallSilentAsync, errorHandler.wrapSafe(fn, context), errorHandler.wrapSafeAsync(fn, context) Asenkron sessiz çağrı; fn'i aynı davranışla saran yeni fonksiyon döndürür (safeCall gibi raporlar).

context yalnız günlükte görünen serbest bir etikettir.

Kullanıcı kodunda hata nerede yakalanır?

Yer Sonuç
Yaşam döngüsü kancası (onConfig, onBuilt, onMounted …), initializeComponent, ref geri çağrısı, Options API ctor, motif.on('x:…') dinleyicisi MJX122 raporu; bileşen kurulmaya devam eder. async kancanın reddedilen promise'i de aynı.
DOM/bileşen olay işleyicisi (onclick, motif.on, on:ad) MJX123 raporu; aynı olayın diğer işleyicileri çalışır.
Uygulama olayı dinleyicisi (app.on, onRouterChanged) MJX123 raporu; diğer dinleyiciler çalışır, gezinme tamamlanır.
effect, bindings.watch, bağ getter'ı, createComputed getter'ı MJX208 raporu; aynı akıtmadaki diğer effect'ler çalışır, hata veren effect izlemeye devam eder. O koşunun değeri yoktur: effect(getter, onValue)'daki onValue çağrılmaz, bağlar (text/attr/class, when/ternary/switchCase dalı) son sağlıklı durumlarını korur.
Rota kancası (onEntering, onEnter, onLeave, onUpdate, onShow) MJX306 raporu; gezinme devam eder.
useGuard guard'ı MJX306 raporu ve gezinme iptal ({ ok: false, cancelled: true, reason: 'guard' }).
Rota bileşeni yapıcısı / import() başarısızlığı MJX304 raporu ve fallbacks.error sayfası (params.error).
Virtualization dataRequest İlk yükleme/yenileme: errorTemplate ya da MJX207; sonraki sayfa: MJX207 + getState().error.
Lazy caller onError, sonra Fallbackview; Fallbackview yoksa MJX126 raporlanır (cause = özgün hata). İptal (signal) raporlanmaz.
DisposableStore.clear/dispose içindeki birden çok hata MJX503 fırlatılır; cause.errors dizisi.
Emitter dinleyicisi onUnexpectedError (varsayılan: yeniden fırlatma) + dinleyiciler.

Geliştirme ve üretim

Geliştirme (app.useDevelopment(true)) Üretim
Raporlar (MJX122 …) konsol + dinleyiciler konsol + dinleyiciler
Uyarılar (MJX2xx, MJX3xx denetimleri …) console.warn yok
safeCallSilent / reportSuppressed konsol yok
Derleyici sözleşmesi uyuşmazlığı (MJX121) console.warn yok

app.useLogging(false) yalnız konsol çıktısını kapatır; dinleyiciler çalışmaya devam eder.

Sonraki adım

Ağ ve dış kaynak çağrılarını yeniden deneme, zaman aşımı ve devre kesiciyle sarmak için Dayanıklılık.