Apakah pada dasarnya ada pengecualian untuk mencegah sistem crash?

16

Kedua, saya bertanya-tanya apakah ada yang tahu apa perbedaan antara pengecualian (dalam bidang aliran kontrol pengecualian) dan Pengecualian (seperti yang digunakan di Jawa).

Tetapi apakah mereka ada di sana untuk melindungi sistem dari crash dengan menghentikan program pengguna?

Dark Templar
sumber

Jawaban:

29

Pengecualian ada untuk memungkinkan Penanganan Eksepsi , yang dapat menghindari crash tetapi lebih umum mencegah perilaku sistem yang tidak diinginkan atau tidak terduga. Sebagai contoh jika koneksi program saya ke database habis biasanya tidak akan merusak sistem, tetapi jika saya bergantung pada data dari database pengecualian dapat memungkinkan saya untuk memperlakukan situasi data-kurang ini berbeda dari biasanya.

Katakan secara default program saya menampilkan halaman data berdasarkan apa yang dikembalikan dari database - well sial, saya tidak punya data. Alih-alih menyajikan tampilan yang kacau atau melanjutkan operasi yang berpotensi tidak valid, saya dapat menangkap pengecualian ini dan kembali ke database yang berbeda, membaca dari data lokal, meminta pengguna untuk data atau mengembalikan pengguna atau sistem ke kondisi aman (mungkin satu itu tidak akan langsung menyebabkan pengecualian yang sama!)

Selain itu dalam sistem di mana input pengguna dapat menjadi penyebab / solusi untuk suatu masalah, pengecualian dapat membuat pengguna mengetahui informasi yang terperinci dan bermanfaat tentang masalah tersebut. Alih-alih terlalu umum "Pengecualian tidak tertangani terjadi di ..." atau "Mengintimidasi Pesan Kesalahan Langsung dari SQL" Anda dapat memberi tahu pengguna sesuatu yang bermanfaat atau setidaknya dapat dimengerti seperti "Tidak dapat terhubung ke sumber daya B."

Ben Brocka
sumber
5
Saya merasa ini adalah jawaban yang paling akurat. Program adalah mesin negara terbatas yang berfungsi. Ada beberapa cara untuk memecah mesin dengan memasukkan data yang buruk, yang akan menyebabkannya tidak berfungsi. Pengecualian diberikan untuk mencegah hal ini. Terkadang mesin dapat memulihkan dirinya sendiri, tetapi kadang-kadang tidak bisa.
Andy
1
Tidak bisakah saya melakukan hal yang sama persis dengan kode kesalahan? Anda mengembalikan kesalahan, dan saya menanganinya.
mskw
16

Pengecualian dibuat untuk menyederhanakan penanganan kesalahan. Tanpa pengecualian, logika penanganan kesalahan harus disebarkan ke seluruh aplikasi. Fungsi apa pun yang mungkin menghasilkan kesalahan harus mengembalikan status kesalahan, dan setiap panggilan harus diikuti oleh pemeriksaan kesalahan. Seringkali penelepon tidak dapat melakukan apa pun yang berguna jika terjadi kesalahan, dan hanya dapat mengembalikan kesalahan itu sendiri. Setengah dari kode aplikasi dapat digunakan untuk penanganan kesalahan. Kode seperti itu sangat rapuh. Terlalu mudah untuk tidak melakukan pemeriksaan kesalahan dan kerusakan, atau lebih buruk, mengembalikan hasil yang salah karena kesalahan yang tidak diketahui.

Dengan pengecualian, kesalahan hanya dapat diperiksa pada titik di mana mereka dapat ditangani. Sebagian besar kode aplikasi dapat ditulis dalam mode garis lurus, karena fungsi akan mengembalikan nilai yang dapat digunakan atau membuat pengecualian.

kevin cline
sumber
5

Poin pengecualian adalah untuk memberi tahu pengguna tentang keadaan luar biasa. Jika ada yang salah dengan sistem, program harus tahu dan diizinkan untuk menanganinya dengan tepat.

Yang mengatakan, tidak, pengecualian tidak ada untuk mencegah sistem dari "crash". Pengecualian membuat saya tahu ada masalah. Bagaimana saya melanjutkan menentukan dapat menentukan apakah sistem "crash".

Perhatikan juga bahwa pengecualian tidak harus menghentikan aplikasi seperti yang Anda katakan. Pengecualian dapat ditangani oleh programmer dan diperbaiki atau diubah menjadi kesalahan yang berarti bagi pengguna.


* Penggunaan pengecualian diperiksa (pengecualian yang dipaksa untuk ditangkap) adalah sedikit tempat yang sakit. Beberapa (mungkin sebagian besar) pengembang menemukan bahwa penanganan pengecualian secara paksa itu rumit, tidak dibutuhkan, dan hanya praktik yang buruk.


sumber
2
Saya tidak setuju, definisi ini terlalu terbatas. Hanya sebagian dari pengecualian yang boleh ditampilkan kepada pengguna. Pengecualian adalah untuk penanganan kesalahan, dan menyerah serta memberi tahu pengguna adalah langkah terakhir yang biasanya diambil, dan seharusnya tidak menjadi norma. Beberapa sistem dirancang untuk menggunakan pengecualian untuk beberapa jenis kontrol aliran juga, seperti akhir iterable, EOF, dll.
Jürgen Strobel
Jürgen, saya mengerti dan sepenuhnya setuju dengan komentar Anda. "Dikoreksi atau berubah menjadi kesalahan yang berarti" - Apakah saya tidak menyampaikan pemikiran itu dengan pernyataan ini?
Ya itu jauh lebih baik sekarang.
Jürgen Strobel
Dapat diperdebatkan, pengecualian tidak boleh ditampilkan kepada pengguna. (Kondisi yang menyebabkan mereka dihasilkan mungkin perlu dilaporkan kepada pengguna entah bagaimana, tetapi tidak sebagai pengecualian.) Tetapi pengecualian selalu lebih baik daripada program yang hanya melakukan DIAF atau keluar kejutan. (“Setiap kali saya mencoba untuk mengurutkan email saya dengan nama pengirim, klien email keluar dengan diam-diam !!” Tidak peduli seberapa bersih jalan keluarnya, itu tetap salah.)
Donal Fellows
2

Pengecualian memungkinkan penanganan kesalahan modern dengan memisahkan lokasi kesalahan dari penangan kesalahan. Terkadang ini digunakan untuk kontrol aliran juga.

Pengecualian yang tidak ditangani mengakhiri sebuah program. Tapi ini tidak berbeda dari pengecualian sebelumnya, hanya seorang programmer malas yang lupa untuk memasukkan penangan kesalahan yang tepat di setiap jalur membuat mereka terlihat oleh pengguna akhir. Saya menganggap program yang diakhiri dengan pengecualian sebagai crash sama dengan akhir yang tidak terduga lainnya.

OS sangat baik dan membersihkan proses yang macet tidak peduli bagaimana mereka macet, jadi pengecualian tidak menambah keamanan OS selain cara menghentikan proses yang tidak berfungsi dan melepaskan sumber dayanya.

Jürgen Strobel
sumber
Ada batasan untuk apa Sistem Operasi dapat membersihkan. Secara umum, OS tidak dapat mengetahui apakah sumber daya yang ada (misalnya file) perlu dibersihkan atau digulung kembali, juga tidak dapat mengetahui apakah ada pembersihan yang diperlukan untuk koneksi jarak jauh, selain hanya menutup koneksi di sisi lokal.
8bittree
2

Ini sangat sederhana.

  • Untuk hanya crash program dan bukan keseluruhan sistem - kami memiliki Sistem Operasi [baik].
  • Untuk membuat crash program alih-alih mengabaikan kesalahan fatal - kami memiliki pengecualian.

Sebelum pengecualian ditemukan, setiap fungsi harus mengembalikan kode keluar (kesalahan / keberhasilan) dan setiap hasil atau output dari fungsi harus diambil dengan mengirimkannya pointer ke memori yang akan ditetapkan olehnya.

Masalahnya adalah bahwa banyak programmer tidak ingat / repot-repot untuk memeriksa kode keluar yang salah untuk setiap fungsi tunggal, dan karenanya kesalahan fatal kadang-kadang diabaikan, menyebabkan perilaku yang sangat tidak dapat dijelaskan.

Oleh karena itu, diputuskan - ketika kesalahan terjadi, yang tidak Anda pertimbangkan, segera crash! Penanganan Pengecualian AKA.

Yam Marcovic
sumber
1

Pengecualian hanyalah mekanisme pendeteksian kesalahan. Sendiri mereka tidak ada gunanya.

Tetapi dengan mendeteksi kesalahan, mereka memungkinkan untuk memicu mekanisme toleransi kesalahan untuk pulih dari keadaan yang salah dengan beralih ke keadaan bebas kesalahan (keadaan sebelumnya atau yang baru). Dengan begitu, kesalahan tidak disebarkan ke bagian lain dari sistem.

mouviciel
sumber
0

Eksepsi ada untuk memisahkan aliran program normal (apa program dirancang untuk melakukan) dari aliran penanganan kesalahan (bagaimana program berusaha untuk pulih dari situasi luar biasa).

Ini membuat kode lebih jelas dan mudah dipelihara.

Pertimbangkan dua sniplets kode:

try:
    do1()  # this is obvoiusly a normal
    do2()  # program flow
except:
    oups()  # this is exception handling code

Dibandingkan dengan yang ini:

if foo():
    thing1()  # is this part of normal program flow?
else:
    thing2()  # or maybe this one? Or both? When?

Tentu saja, penanganan pengecualian dapat digunakan untuk mencegah program mogok dengan:

try {    // very bad code
    my();
    whole();
    ugly();
    application();
    here();
} catch (Throwable t) {
    // pretend it's ok
}

tetapi ini bukan alasan untuk pengecualian dalam bahasa pemrograman modern.

Anda juga dapat menggunakan whiledan breakbukannya iftetapi ini bukan untuk apa whiledan breakuntuk.

Michał Šrajer
sumber
Sebenarnya menangani aliran kontrol "abnormal" adalah tepatnya ketika goto dan temannya istirahat adalah yang paling berguna. Keuntungan dari pengecualian adalah bahwa mereka dapat melewati batas fungsi dan penelepon dapat menentukan di mana yang paling tepat untuk menangkapnya.
hugomg
@hugomg: Keuntungan besar lain dari pengecualian adalah mereka memungkinkan pembersihan sumber daya dan tindakan serupa lainnya dilakukan antara tempat di mana pengecualian dilemparkan dan tempat penanganannya.
supercat