Javascript ile hata mesajlarını özelleştirmek geçmişte çok zor iken ES6 ile birlikte aslında çok daha kolay hale getirildi. Bu yazımızda error mesajlarımızı daha okunabilir ve temiz bir şekilde nasıl veririz ona değinmek istiyorum.
Normalde Javascript try/catch/finally şeklinde kullanımı destekliyor diğer dillerde olduğu gibi. Fakat iş ne zaman hata mesajını yazdırmak istediğinizde elinizde sadece Error() fonksiyonu oluyor ama Error() tek başına yeterli değil malasef. Errorlarınızı mesajları ile birlikte tek bir yerde toplamak ve onlara uygun mesajlar vermek projeniz büyüdüğünde hata ayıklamanızı çok daha basit bir hale getiriyor.
Kendi error classımızı yazmadan önce Javascript defaultta hangi error mesajlarına sahip bir şuradan göz atalım.
Error class oluşturmak
Eğer Java gibi object oriented bir dilden geliyorsanız bu kısım size hiç yabancı gelmeyecektir. Benzer şekilde error classını extend edip kendi error typelarınızı rahatlıkla oluşturabilirsiniz.Buda bizi sürekli new Error demek yerine new YourErrorType şeklinde kullanmamızı sağlıyor. Bu sayede kod okunabilirliği ve net hata mesajları gönderebiliyoruz.
Database için bir error class oluşturalım. Bu dosyanın isminede error.js adını verelim.
class DatabaseError extends Error { constructor(message) { super(message) this.name = 'DatabaseError' this.message = message } } module.exports = { DatabaseError }
index.js dosyamızın içindede bu hata mesajını almak için basit bir fonksiyon oluşturalım.
const { DatabaseError } = require('./error') function connectDB(input) { if (!input) throw new DatabaseError("Can't connect to database") return input } connectDB()
Bu sayede en basit haliyle error classımızı oluşturuyoruz. new Error(“Cant’t connect to database”) demekten ne farkı var diyebilirsiniz. Onuda basit bir örnek ile özetliyelim.
try { connectDB(null) } catch (e) { if (e.name === 'DatabaseError') { console.log("Handle input validation error") } else { console.log("Handle other errors") } }
Böylece hatanızın türünüze göre try catch kullandığınız yerlerde çeşitli aksiyonları almanızda kolaylık sağlar. Ayrıca daha temiz kod yazmanıza, ekibe yeni katılan arkadaşlarınızın hangi hata türlerini handle etmesi gerektikleri hakkında bir fikirleri olmuş olur.
Hata mesajlarının çıktılarını JSON formatında almak
Hata mesajlarından JSON çıktı alabilmek özellikle API geliştirirken hata mesajlarınızı döndürmede büyük kolaylık sağlıyor. Bunun için tek yapmamız gereken error classımıza bir fonksiyon tanımlamak.
class DatabaseError extends Error { constructor(message) { super(message) this.name = 'DatabaseError' this.message = message } toJSON() { return { error: { name: this.name, message: this.message, stacktrace: this.stack } } } } module.exports = { DatabaseError }
Artık toJSON methodunu kullanarak hata çıktılarınızı JSON formatta alabilirsiniz.
new DatabaseError("Can't connect to database").toJSON()
Örnek çıktı
{ error: { name: 'DatabaseError', message: "Can't connect to database", stacktrace: "DatabaseError: Can't connect to database\n at connectDB " + '(C:\\Users\\baran\\Desktop\\test\\test.js:4:17)\n at ' + 'Object.<anonymous> (C:\\Users\\baran\\Desktop\\test\\test.js:8:1)\n at ' + 'Module._compile (internal/modules/cjs/loader.js:759:30)\n at ' + 'Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)\n ' + ' at Module.load (internal/modules/cjs/loader.js:628:32)\n at ' + 'Function.Module._load (internal/modules/cjs/loader.js:555:12)\n at ' + 'Function.Module.runMain (internal/modules/cjs/loader.js:826:10)\n at ' + 'internal/main/run_main_module.js:17:11' } }