Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Hasil evaluasi ekspresi M menghasilkan salah satu hasil berikut:
Satu nilai diproduksi.
Kesalahan dimunculkan, menunjukkan proses evaluasi ekspresi tidak dapat menghasilkan nilai. Kesalahan berisi nilai rekaman tunggal yang dapat digunakan untuk memberikan informasi tambahan tentang apa yang menyebabkan evaluasi yang tidak lengkap.
Kesalahan dapat dimunculkan dari dalam ekspresi, dan dapat ditangani dari dalam ekspresi.
Meningkatkan kesalahan
Sintaks untuk meningkatkan kesalahan adalah sebagai berikut:
error-raising-expression:
error
Ekspresi
Nilai teks dapat digunakan sebagai singkatan untuk nilai kesalahan. Contohnya:
error "Hello, world" // error with message "Hello, world"
Nilai kesalahan penuh adalah rekaman dan dapat dibangun menggunakan Error.Record fungsi :
error Error.Record("FileNotFound", "File my.txt not found",
"my.txt")
Ekspresi di atas setara dengan:
error [
Reason = "FileNotFound",
Message = "File my.txt not found",
Detail = "my.txt"
]
Meningkatkan kesalahan akan menyebabkan evaluasi ekspresi saat ini berhenti, dan tumpukan evaluasi ekspresi akan melepas lelah hingga salah satu hal berikut ini terjadi:
Bidang rekaman, anggota bagian, atau biarkan variabel—secara kolektif: entri—tercapai. Entri ditandai sebagai mengalami kesalahan, nilai kesalahan disimpan dengan entri tersebut, lalu disebarluaskan. Setiap akses berikutnya ke entri tersebut akan menyebabkan kesalahan identik dimunculkan. Entri lain dari rekaman, bagian, atau ekspresi biarkan tidak selalu terpengaruh (kecuali jika mereka mengakses entri yang sebelumnya ditandai sebagai mengalami kesalahan).
Ekspresi tingkat atas tercapai. Dalam hal ini, hasil evaluasi ekspresi tingkat atas adalah kesalahan alih-alih nilai.
Ekspresi
trytercapai. Dalam hal ini, kesalahan diambil dan dikembalikan sebagai nilai.
Menangani kesalahan
Ekspresi penanganan kesalahan (secara informal dikenal sebagai "ekspresi coba") digunakan untuk menangani kesalahan:
error-handling-expression:
try
opt penangankesalahan ekspresi terproteksi
ekspresi terproteksi:
ekspresi
error-handler:
jika tidak, klausul
catch-clause
jika tidak, klausul:
otherwise
ekspresi default
ekspresi default:
expression
catch-clause:
catch
catch-function
catch-function:
(
parameter-nameopt)=>function-body
Berikut ini berlaku saat mengevaluasi ekspresi penanganan kesalahan tanpa penanganan kesalahan:
- Jika evaluasi ekspresi yang dilindungi tidak mengakibatkan kesalahan dan menghasilkan nilai x, nilai yang dihasilkan oleh error-handling-expression adalah rekaman dari formulir berikut:
[ HasErrors = false, Value = x ]
- Jika evaluasi ekspresi terproteksi memunculkan nilai kesalahan e, hasil dari ekspresi penanganan kesalahan adalah rekaman formulir berikut:
[ HasErrors = true, Error = e ]
Berikut ini berlaku saat mengevaluasi ekspresi penanganan kesalahan dengan penanganan kesalahan:
Ekspresi terproteksi harus dievaluasi sebelum penanganan kesalahan.
Penanganan kesalahan harus dievaluasi jika dan hanya jika evaluasi ekspresi terproteksi menimbulkan kesalahan.
Jika evaluasi ekspresi terproteksi menimbulkan kesalahan, nilai yang dihasilkan oleh ekspresi penanganan kesalahan adalah hasil dari mengevaluasi penanganan kesalahan.
Kesalahan yang dimunculkan selama evaluasi penanganan kesalahan disebarluaskan.
Ketika penanganan kesalahan yang dievaluasi adalah klausul tangkapan, fungsi tangkapan dipanggil. Jika fungsi tersebut menerima parameter, nilai kesalahan akan diteruskan sebagai nilainya.
Contoh berikut mengilustrasikan ekspresi penanganan kesalahan dalam kasus di mana tidak ada kesalahan yang dimunculkan:
let
x = try "A"
in
if x[HasError] then x[Error] else x[Value]
// "A"
Contoh berikut menunjukkan peningkatan kesalahan lalu menanganinya:
let
x = try error "A"
in
if x[HasError] then x[Error] else x[Value]
// [ Reason = "Expression.Error", Message = "A", Detail = null ]
Contoh sebelumnya dapat ditulis ulang dengan sintaks yang lebih sedikit dengan menggunakan klausul tangkapan dengan fungsi tangkapan yang menerima parameter:
let
x = try error "A" catch (e) => e
in
x
// [ Reason = "Expression.Error", Message = "A", Detail = null ]
Klausa sebaliknya dapat digunakan untuk mengganti kesalahan yang ditangani oleh ekspresi coba dengan nilai alternatif:
try error "A" otherwise 1
// 1
Klausul tangkapan dengan fungsi tangkapan parameter nol secara efektif merupakan sintaks alternatif yang lebih panjang untuk klausa sebaliknya:
try error "A" catch () => 1
// 1
Jika error-handler juga menimbulkan kesalahan, maka begitu juga seluruh ekspresi percobaan:
try error "A" otherwise error "B"
// error with message "B"
try error "A" catch () => error "B"
// error with message "B"
try error "A" catch (e) => error "B"
// error with message "B"
Kesalahan dalam rekaman dan membiarkan penginisialisasi
Contoh berikut menunjukkan penginisialisasi rekaman dengan bidang A yang menimbulkan kesalahan dan diakses oleh dua bidang B lain dan C. Bidang B tidak menangani kesalahan yang dimunculkan oleh A, tetapi C tidak. Bidang D akhir tidak mengakses A sehingga tidak terpengaruh oleh kesalahan di A.
[
A = error "A",
B = A + 1,
C = let x =
try A in
if not x[HasError] then x[Value]
else x[Error],
D = 1 + 1
]
Hasil evaluasi ekspresi di atas adalah:
[
A = // error with message "A"
B = // error with message "A"
C = "A",
D = 2
]
Penanganan kesalahan dalam M harus dilakukan mendekati penyebab kesalahan untuk menangani efek inisialisasi bidang malas dan evaluasi penutupan yang ditangguhkan. Contoh berikut menunjukkan upaya yang tidak berhasil dalam menangani kesalahan menggunakan try ekspresi:
let
f = (x) => [ a = error "bad", b = x ],
g = try f(42) otherwise 123
in
g[a] // error "bad"
Dalam contoh ini, definisi g dimaksudkan untuk menangani kesalahan yang dimunculkan saat memanggil f. Namun, kesalahan dimunculkan oleh penginisialisasi bidang yang hanya berjalan saat diperlukan dan dengan demikian setelah rekaman dikembalikan dari f dan melewati try ekspresi.
Kesalahan tidak diimplementasikan
Saat ekspresi sedang dikembangkan, penulis mungkin ingin meninggalkan implementasi untuk beberapa bagian ekspresi, tetapi mungkin masih ingin dapat menjalankan ekspresi. Salah satu cara untuk menangani kasus ini adalah dengan memunculkan kesalahan untuk bagian yang tidak terimpilemen. Contohnya:
(x, y) =>
if x > y then
x - y
else
error Error.Record("Expression.Error",
"Not Implemented")
Simbol elipsis (...) dapat digunakan sebagai pintasan untuk error.
tidak diimplementasikan-ekspresi:
...
Misalnya, berikut ini setara dengan contoh sebelumnya:
(x, y) => if x > y then x - y else ...