Satu pandangan tentang Pengendalian Ralat Gaya Go dalam JavaScript

Barbara Streisand
Lepaskan: 2024-10-16 16:32:02
asal
219 orang telah melayarinya

A take on Go Style Error Handling in JavaScript

Hampir semua orang yang menggunakan JavaScript setiap hari tahu bahawa cuba-tangkap boleh menyakitkan untuk ditangani, terutamanya apabila anda mempunyai lebih daripada satu ralat untuk dikendalikan.

Kebanyakan penyelesaian yang dicadangkan cuba menyalin pendekatan Golang - yang mengendalikan segala-galanya sebagai nilai pulangan. Ia, antara lain, ialah ciri hebat Go, tetapi JS adalah bahasa yang sama sekali berbeza (duh) dan saya fikir kita boleh melakukan lebih baik daripada salin-tampal daripada Go.

Dalam Go, apabila kami ingin mengendalikan ralat, kami mengembalikannya daripada panggilan fungsi sama ada sebagai nilai kedua dalam tuple atau sebagai nilai pulangan bagi panggilan fungsi. Berikut ialah coraknya:

result, error := DoSomething()
if error != nil {
 // handle error
}
Salin selepas log masuk

Pendekatan ini membolehkan untuk mengendalikan ralat secara eksplisit menggunakan aliran kawalan standard.

Untuk menggunakan corak ini dalam javascript, penyelesaian yang paling biasa ialah mengembalikan hasil sebagai tatasusunan:

const handler = async (promise) => {
  try {
    const result = await promise()
    return [result, null];
  } catch(error) {
    return [null, error];
  }
}

const [response, error] = await handle(fetch('http://go.gl'))
if (error !== null) {
  // handle error
}
Salin selepas log masuk

Seperti yang anda lihat, ini hampir salin-tampal terus corak daripada Go.

Mengembalikan nilai konsisten

Corak ini berfungsi dengan baik, tetapi dalam javascript kita boleh melakukan lebih baik daripada ini. Idea teras corak ini adalah untuk mengembalikan ralat sebagai nilai, jadi mari kita sesuaikan dengan SoC yang lebih baik.

Daripada mengembalikan null atau Ralat, kami boleh menghiasi hasilnya dengan antara muka yang konsisten. Itu akan meningkatkan SoC kami dan memberi kami nilai pulangan yang ditaip kuat:

interface Status {
  Ok(): boolean;
  Fail(): boolean;
  Of(cls: any): boolean;
}
Salin selepas log masuk

Status antara muka tidak semestinya Ralat, tetapi kami boleh menyemak jenisnya menggunakan status.Of(Error). Kami sentiasa boleh mengembalikan objek yang memenuhi Status. Contoh penggunaan ialah:

const [response, error] = await handle(res.json())
if (error.Of(SyntaxError)) {
  // handle error
  console.log("not a json")
  return
}
Salin selepas log masuk

Sekarang, dalam JavaScript hasil kami tidak semestinya satu tuple. Kita sebenarnya boleh mencipta kelas kita sendiri yang berkelakuan sebagai tuple apabila ia diperlukan:

interface IResult<T> {
  0: T;
  1: Status;
  value: T;
  status: Status;
  Of(cls: any): boolean;
  Ok(): boolean;
  Fail(): boolean;
}
Salin selepas log masuk

Contoh penggunaan:

const result = await handle(res.value.json())
if (result.Of(SyntaxError)) {
  // handle error
  console.log("not a json")
  return
}
Salin selepas log masuk

Perlaksanaan

Berikutan pendekatan ini, saya telah mencipta fungsi sedia untuk digunakan - Grip.

Grip ditaip dengan kuat dan boleh menghiasi fungsi dan janji yang sama.

Saya menggunakan git untuk mengehoskan pakej sedemikian, jadi untuk memasang gunakan github:

bun add github:nesterow/grip # or pnpm
Salin selepas log masuk

penggunaan:

Fungsi cengkaman menerima fungsi atau janji dan mengembalikan hasil dengan nilai dan status pulangan.
Hasilnya boleh dibuat sama ada sebagai objek atau tupel.

import { grip } from '@nesterow/grip';
Salin selepas log masuk

Mengendalikan hasil sebagai objek:

Hasilnya boleh dikendalikan sebagai objek: {value, status, Ok(), Fail(), Of(type)}

const res = await grip(
  fetch('https://api.example.com')
);

if (res.Fail()) {
    handleErrorProperly();
    return;
}

const json = await grip(
  res.value.json()
);

if (json.Of(SyntaxError)) {
    handleJsonParseError();
    return;
}

Salin selepas log masuk

Mengendalikan hasil sebagai tupel:

Hasilnya juga boleh diterima sebagai tupel jika anda ingin menangani ralat dalam gaya Go'ish:

const [res, fetchStatus] = await grip(
  fetch('https://api.example.com')
);
if (fetchStatus.Fail()) {
    handleErrorProperly();
    return;
}

const [json, parseStatus] = await grip(
  res.json()
);
if (parseStatus.Of(SyntaxError)) {
    handleJsonParseError();
    return;
}
Salin selepas log masuk

Jika anda suka perkara ini, lakukan pengendalian ralat, lihat repositori. Sumbernya adalah kira-kira 50LOC, tanpa jenis dan 100 dengan jenis.

Atas ialah kandungan terperinci Satu pandangan tentang Pengendalian Ralat Gaya Go dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!