Apakah pengecualian menangani masalah lintas sektoral?

13

Saya tidak melihat banyak perbedaan antara kekhawatiran tentang penanganan pengecualian dan penebangan karena keduanya merupakan masalah lintas sektoral. Bagaimana menurut anda? Bukankah itu harus ditangani secara terpisah sendiri daripada disisipkan dengan logika inti metode yang diterapkan?

EDIT : Apa yang saya coba katakan, adalah bahwa menurut saya implementasi metode seharusnya hanya berisi logika untuk jalur eksekusi yang sukses dan pengecualian harus ditangani di tempat lain. Ini bukan tentang pengecualian yang dicentang / tidak dicentang.

Misalnya, bahasa mungkin menangani pengecualian dengan cara yang sepenuhnya diperiksa dengan menggunakan konstruksi seperti ini:

class FileReader {

  public String readFile(String path) {
    // implement the reading logic, avoid exception handling
  }

}

handler FileReader {

   handle String readFile(String path) {
      when (IOException joe) {
        // somehow access the FileInputStram and close it
      }
   }

}

Dalam bahasa konseptual di atas, program tidak akan dikompilasi dengan tidak adanya FileReader handler , karena readFile FileReader kelas tidak melempar pengecualian. Jadi dengan mendeklarasikanFileReader handler , kompiler dapat memastikan bahwa ia sedang ditangani dan program kemudian mengkompilasi.

Dengan cara ini kami memiliki yang terbaik dari masalah pengecualian diperiksa dan tidak dicentang: ketahanan dan keterbacaan.

Behrang Saeedzadeh
sumber

Jawaban:

14

Dalam beberapa kasus ya

Dalam kasus di mana Anda memiliki pengecualian yang ingin Anda login (yang saya anggap hampir selalu) maka ya pengecualian terkait dengan masalah lintas sektoral.

Sebagian besar waktu tidak

Namun ambil instance dari SocketListener, jika socketlistener melempar pengecualian karena ujung yang lain menjatuhkan koneksi, maka ini perilaku yang harus diantisipasi dan aplikasi harus bertindak sesuai dengan keadaan yang menyebabkan pengecualian. Ini bukan sesuatu yang harus ditangani oleh Aspek generik, dan karenanya tidak boleh menjadi masalah lintas sektoral.

Identifikasi masalah lintas sektoral

Jika Anda menduplikasi kode yang sama berulang kali itu perlu diabstraksikan. Jika abstraksi mempromosikan dirinya ke beberapa lapisan, itu bisa menjadi masalah lintas sektoral. Baru setelah itu harus dipertimbangkan.

Justin Shield
sumber
4

Logging adalah opsional. Menangani pengecualian tidak.

Logging cukup umum dan walaupun berasal dari logika spesifik, ia diumpankan ke konsumen umum. Pengecualian selalu spesifik untuk logika dan beberapa kode yang memiliki pengetahuan tentang logika itu harus menangani kekacauan yang dibuatnya.

Setidaknya dalam penggunaan saya yang terbatas pada dua hal itu berarti bahwa kedua tujuan tersebut ditangani dengan cara yang berbeda dan tidak di bawah payung desain yang sama.

Patrick Hughes
sumber
1

Saya melihat penanganan eksepsi sebagai masalah lintas sektoral untuk beberapa jenis pengecualian. Ada pengecualian lokal yang hanya dapat ditangani dengan benar oleh kode panggilan langsung. Contoh mungkin pengecualian database ketika mencoba menjalankan kueri. Tetapi ada juga pengecualian yang dapat dan harus ditangani secara lebih global. Contoh mungkin pengecualian terkait kurangnya kredensial keamanan (memaksa pengguna untuk masuk kembali). Atau paling tidak Anda membutuhkan penangan global jika ada pengecualian yang menyelinap melalui kode yang lebih spesifik, untuk menjelaskan kepada pengguna apa yang harus mereka lakukan untuk memulai kembali atau mengirim log ke IT atau sesuatu seperti itu. Untuk jenis-jenis pengecualian yang ditangani secara global ini, ini merupakan masalah lintas sektoral.

RasionalGeek
sumber
0

Saya pikir ini terkait dengan masalah abstraksi yang bocor.

Banyak pengecualian harus ditangkap dan dipulihkan kembali karena mereka menembus lapisan abstraksi. Pelemparan ulang harus membuang pengecualian dalam bentuk baru, sesuai dengan abstraksi yang melakukan pelemparan ulang, sehingga masuk akal sebagai bagian dari antarmuka. Dengan kata lain, pengecualian dari level abstraksi yang lebih rendah harus diterjemahkan ke dalam bentuk abstraksi saat ini sehingga level abstraksi yang lebih tinggi tidak perlu tahu tentang level yang lebih rendah, bahkan murni untuk penanganan pengecualian.

Namun, "prinsip abstraksi bocor" adalah masalah. Beberapa pengecualian tidak dapat diterjemahkan ke bentuk yang masuk akal di dalam lapisan abstraksi berikutnya.

Pengecualian terkait filesystem jaringan adalah contoh sederhana. Kegagalan jaringan tidak dapat dinyatakan dalam istilah yang masuk akal untuk abstraksi "file" atau, jika ya, abstraksi tersebut belum sepenuhnya sepenuhnya mengabstraksi semua detail yang berkaitan dengan implementasi penanganan file.

Kegagalan jaringan karena itu akan bocor dari abstraksi jaringan yang mendasarinya, dan karena itu harus menjadi perhatian lintas sektor dalam sisa kode.

Ini tidak unik untuk pengecualian. Semua kode kesalahan nilai-kembali untuk API file yang tidak benar-benar terkait dengan abstraksi file, tetapi merinci hard-disk atau jaringan atau kegagalan apa pun adalah hal yang sama dalam bentuk yang berbeda, menyiratkan bahwa kegagalan hard disk dan kegagalan jaringan dll adalah masalah lintas sektoral terlepas dari bagaimana kegagalan tersebut dilaporkan.

Steve314
sumber