Wajah menggunakan penangan kesalahan javascript

Penanganan Kesalahan mengacu pada bagaimana Express menangkap dan memproses kesalahan yang terjadi baik secara sinkron maupun asinkron. Express hadir dengan penangan kesalahan default sehingga Anda tidak perlu menulis sendiri untuk memulai

Penting untuk memastikan bahwa Express menangkap semua kesalahan yang terjadi saat menjalankan penangan rute dan middleware

Kesalahan yang terjadi pada kode sinkron di dalam route handler dan middleware tidak memerlukan kerja ekstra. Jika kode sinkron melontarkan kesalahan, Express akan menangkap dan memprosesnya. Misalnya

app.get('/', (req, res) => {
  throw new Error('BROKEN') // Express will catch this on its own.
})

Untuk kesalahan yang dikembalikan dari fungsi asinkron yang dipanggil oleh penangan rute dan middleware, Anda harus meneruskannya ke fungsi

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
5, tempat Express akan menangkap dan memprosesnya. Misalnya

________satu_______

Dimulai dengan Express 5, route handler dan middleware yang mengembalikan Promise akan memanggil

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_6 secara otomatis saat mereka menolak atau melontarkan kesalahan. Misalnya

app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
_

Jika

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_7 melempar kesalahan atau menolak,
app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_8 akan dipanggil dengan kesalahan yang dilemparkan atau nilai yang ditolak. Jika tidak ada nilai yang ditolak diberikan,
app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_8 akan dipanggil dengan objek Error default yang disediakan oleh router Express

Jika Anda meneruskan apa pun ke fungsi

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_5 (kecuali string
app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
_1), Express menganggap permintaan saat ini sebagai kesalahan dan akan melewatkan fungsi perutean dan middleware penanganan non-kesalahan yang tersisa

Jika panggilan balik secara berurutan tidak memberikan data, hanya kesalahan, Anda dapat menyederhanakan kode ini sebagai berikut

app.get('/', [
  function (req, res, next) {
    fs.writeFile('/inaccessible-path', 'data', next)
  },
  function (req, res) {
    res.send('OK')
  }
])

Dalam contoh di atas

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_8 disediakan sebagai panggilan balik untuk
app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
3, yang disebut dengan atau tanpa kesalahan. Jika tidak ada kesalahan, penangan kedua dijalankan, jika tidak, Express akan menangkap dan memproses kesalahan tersebut

Anda harus menangkap kesalahan yang terjadi dalam kode asinkron yang dipanggil oleh penangan rute atau middleware dan meneruskannya ke Express untuk diproses. Misalnya

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})

Contoh di atas menggunakan blok

app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
_4 untuk menangkap kesalahan dalam kode asinkron dan meneruskannya ke Express. Jika
app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
4 blok dihilangkan, Express tidak akan menangkap kesalahan karena itu bukan bagian dari kode penangan sinkron

Gunakan janji untuk menghindari overhead blok

app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
4 atau saat menggunakan fungsi yang mengembalikan janji. Misalnya

app.get('/', (req, res, next) => {
  Promise.resolve().then(() => {
    throw new Error('BROKEN')
  }).catch(next) // Errors will be passed to Express.
})

Karena janji secara otomatis menangkap kesalahan sinkron dan janji yang ditolak, Anda cukup memberikan

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_8 sebagai penangan tangkapan terakhir dan Ekspres akan menangkap kesalahan, karena penangan tangkapan diberi kesalahan sebagai argumen pertama

Anda juga bisa menggunakan rantai penangan untuk mengandalkan penangkapan kesalahan sinkron, dengan mereduksi kode asinkron menjadi sesuatu yang sepele. Misalnya

app.get('/', [
  function (req, res, next) {
    fs.readFile('/maybe-valid-file', 'utf-8', (err, data) => {
      res.locals.data = data
      next(err)
    })
  },
  function (req, res) {
    res.locals.data = res.locals.data.split(',')[1]
    res.send(res.locals.data)
  }
])

Contoh di atas memiliki beberapa pernyataan sepele dari panggilan

app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
8. Jika
app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
_8 menyebabkan kesalahan, maka kesalahan akan diteruskan ke Express, jika tidak, Anda akan segera kembali ke dunia penanganan kesalahan sinkron di penangan berikutnya dalam rangkaian. Kemudian, contoh di atas mencoba mengolah data. Jika ini gagal maka penangan kesalahan sinkron akan menangkapnya. Jika Anda telah melakukan pemrosesan ini di dalam callback _
app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})
8 maka aplikasi mungkin akan keluar dan penangan kesalahan Express tidak akan berjalan

Apapun metode yang Anda gunakan, jika Anda ingin penangan kesalahan Express dipanggil dan aplikasi bertahan, Anda harus memastikan bahwa Express menerima kesalahan

Penangan kesalahan default

Express hadir dengan penangan kesalahan bawaan yang menangani setiap kesalahan yang mungkin ditemui di aplikasi. Fungsi middleware penanganan kesalahan default ini ditambahkan di akhir tumpukan fungsi middleware

Jika Anda meneruskan kesalahan ke

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_5 dan Anda tidak menanganinya dalam penangan kesalahan khusus, itu akan ditangani oleh penangan kesalahan bawaan; . Pelacakan tumpukan tidak termasuk dalam lingkungan produksi

Setel variabel lingkungan

app.get('/', [
  function (req, res, next) {
    fs.writeFile('/inaccessible-path', 'data', next)
  },
  function (req, res) {
    res.send('OK')
  }
])
_2 ke
app.get('/', [
  function (req, res, next) {
    fs.writeFile('/inaccessible-path', 'data', next)
  },
  function (req, res) {
    res.send('OK')
  }
])
3, untuk menjalankan aplikasi dalam mode produksi

Ketika kesalahan ditulis, informasi berikut ditambahkan ke respons

  • app.get('/', [
      function (req, res, next) {
        fs.writeFile('/inaccessible-path', 'data', next)
      },
      function (req, res) {
        res.send('OK')
      }
    ])
    
    _4 diatur dari
    app.get('/', [
      function (req, res, next) {
        fs.writeFile('/inaccessible-path', 'data', next)
      },
      function (req, res) {
        res.send('OK')
      }
    ])
    
    5 (atau
    app.get('/', [
      function (req, res, next) {
        fs.writeFile('/inaccessible-path', 'data', next)
      },
      function (req, res) {
        res.send('OK')
      }
    ])
    
    6). Jika nilai ini berada di luar rentang 4xx atau 5xx, maka akan disetel ke 500
  • app.get('/', [
      function (req, res, next) {
        fs.writeFile('/inaccessible-path', 'data', next)
      },
      function (req, res) {
        res.send('OK')
      }
    ])
    
    _7 diatur sesuai dengan kode status
  • Badan akan menjadi HTML dari pesan kode status saat berada di lingkungan produksi, jika tidak akan menjadi
    app.get('/', [
      function (req, res, next) {
        fs.writeFile('/inaccessible-path', 'data', next)
      },
      function (req, res) {
        res.send('OK')
      }
    ])
    
    8
  • Header apa pun yang ditentukan dalam objek
    app.get('/', [
      function (req, res, next) {
        fs.writeFile('/inaccessible-path', 'data', next)
      },
      function (req, res) {
        res.send('OK')
      }
    ])
    
    _9

Jika Anda memanggil

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
5 dengan kesalahan setelah Anda mulai menulis respons (misalnya, jika Anda mengalami kesalahan saat mengalirkan respons ke klien), penangan kesalahan default Express akan menutup koneksi dan menggagalkan permintaan

Jadi, saat Anda menambahkan penangan kesalahan khusus, Anda harus mendelegasikan ke penangan kesalahan Express default, saat header telah dikirim ke klien

function errorHandler (err, req, res, next) {
  if (res.headersSent) {
    return next(err)
  }
  res.status(500)
  res.render('error', { error: err })
}

Perhatikan bahwa penangan kesalahan default dapat dipicu jika Anda memanggil

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
5 dengan kesalahan dalam kode Anda lebih dari sekali, bahkan jika middleware penanganan kesalahan khusus sudah ada

Definisikan fungsi middleware penanganan kesalahan dengan cara yang sama seperti fungsi middleware lainnya, kecuali fungsi penanganan kesalahan memiliki empat argumen, bukan tiga.

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
2. Misalnya

app.use((err, req, res, next) => {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

Anda menentukan middleware penanganan kesalahan terakhir, setelah

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
3 lainnya dan merutekan panggilan;

const bodyParser = require('body-parser')
const methodOverride = require('method-override')

app.use(bodyParser.urlencoded({
  extended: true
}))
app.use(bodyParser.json())
app.use(methodOverride())
app.use((err, req, res, next) => {
  // logic
})

Respons dari dalam fungsi middleware bisa dalam format apa pun, seperti halaman kesalahan HTML, pesan sederhana, atau string JSON

Untuk tujuan organisasi (dan kerangka tingkat yang lebih tinggi), Anda dapat menentukan beberapa fungsi middleware penanganan kesalahan, seperti yang Anda lakukan dengan fungsi middleware biasa. Misalnya, untuk menentukan penangan kesalahan untuk permintaan yang dibuat dengan menggunakan

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
4 dan yang tidak

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_0

Dalam contoh ini,

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
_5 generik mungkin menulis permintaan dan informasi kesalahan ke
app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
6, misalnya

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_1

Juga dalam contoh ini,

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
7 didefinisikan sebagai berikut;

Perhatikan bahwa saat tidak memanggil "selanjutnya" dalam fungsi penanganan kesalahan, Anda bertanggung jawab untuk menulis (dan mengakhiri) respons. Jika tidak, permintaan tersebut akan "digantung" dan tidak memenuhi syarat untuk pengumpulan sampah

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_2

Terapkan fungsi “catch-all” ________13______8 sebagai berikut (misalnya)

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_3

Jika Anda memiliki pengendali rute dengan beberapa fungsi panggilan balik, Anda dapat menggunakan parameter

app.get('/', (req, res, next) => {
  setTimeout(() => {
    try {
      throw new Error('BROKEN')
    } catch (err) {
      next(err)
    }
  }, 100)
})
9 untuk melompat ke pengendali rute berikutnya. Misalnya

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
_4

Dalam contoh ini, penangan

app.get('/', (req, res, next) => {
  Promise.resolve().then(() => {
    throw new Error('BROKEN')
  }).catch(next) // Errors will be passed to Express.
})
_0 akan dilewati tetapi penangan yang tersisa di
app.get('/', (req, res, next) => {
  Promise.resolve().then(() => {
    throw new Error('BROKEN')
  }).catch(next) // Errors will be passed to Express.
})
_1 untuk
app.get('/', (req, res, next) => {
  Promise.resolve().then(() => {
    throw new Error('BROKEN')
  }).catch(next) // Errors will be passed to Express.
})
2 akan terus dieksekusi

Panggilan ke

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
5 dan
app.get('/', (req, res, next) => {
  Promise.resolve().then(() => {
    throw new Error('BROKEN')
  }).catch(next) // Errors will be passed to Express.
})
4 menunjukkan bahwa penangan saat ini selesai dan dalam keadaan apa.
app.get('/', (req, res, next) => {
  Promise.resolve().then(() => {
    throw new Error('BROKEN')
  }).catch(next) // Errors will be passed to Express.
})
4 akan melewatkan semua penangan yang tersisa dalam rantai kecuali yang diatur untuk menangani kesalahan seperti yang dijelaskan di atas

Bagaimana wajah membuat penanganan kesalahan yang baik?

Face Membuat Error Handling yang Baik .
Gunakan bahasa yang mudah dipahami oleh pengguna
Hindari kata-kata seperti. boneka buruk dll
menghindari kalimat perintah
FAQ (Pertanyaan yang Sering Diajukan)
Mengoptimalkan dan memanfaatkan fungsi undo redo dan cancel
berbagai macam model respon
Validasi masukan. /

Mengapa menggunakan try catch?

Tujuan dari blok try - catch adalah menangkap dan pegangan yang dihasilkan oleh kode kerja.

Kapan harus menggunakan try catch?

Untuk menangani error di Java, digunakan sebuah statement yang bernama try . tangkap . Statement tersebut digunakan untuk mengurung eksekusi yang menampilkan error dan dapat membuat program tetap berjalan tanpa dihentikan secara langsung.

Apa yang Anda ketahui tentang exception handling jelaskan dan berikan contohnya?

Exception Handling merupakan mekanisme yang paling diperlukan dalam menangani error yang terjadi pada saat runtime (program berjalan) atau yang lebih dikenal dengan sebutan runtime error . Secara umum, adanya error/error yang terjadi pada program pada saat runtime dapat menyebabkan program berhenti atau hang.