Setelah membaca posting kemarin, saya menyadari saya tidak tahu banyak tentang asal-usul pengecualian. Apakah ini hanya konsep terkait OOP? Saya cenderung berpikir begitu, tapi sekali lagi ada pengecualian basis data.
37
Setelah membaca posting kemarin, saya menyadari saya tidak tahu banyak tentang asal-usul pengecualian. Apakah ini hanya konsep terkait OOP? Saya cenderung berpikir begitu, tapi sekali lagi ada pengecualian basis data.
goto
benar. Secara khusus, target dari lemparan ditentukan oleh konteks, berdasarkan pada bersarangnya struktur blok. Dengan demikian, pengecualian bahkan tergantung pada bentuk pemrograman terstruktur yang sedikit kurang ketat di mana prinsip jalan keluar tunggal diambil sebagai pedoman, tetapi bukan mutlak ".Jawaban:
Pengecualian bukan konsep OOP.
Tetapi mereka tidak sepenuhnya tidak berhubungan baik dalam satu titik kecil kecil.
Seperti yang ditunjukkan oleh jawaban lain: Konsep pengecualian telah membuatnya dalam beberapa bahasa non-OOP. Tidak ada dalam konsep itu yang membutuhkan sesuatu dari OOP.
Tetapi apa pun jika tidak semua bahasa OOP yang menganggap serius OOP memerlukan pengecualian karena metode penanganan kesalahan lainnya gagal pada satu titik tertentu: Konstruktor.
Salah satu poin dari OOP adalah bahwa suatu objek harus merangkum dan mengelola keadaan internalnya secara lengkap dan konsisten. Ini juga berarti bahwa dalam OOP murni, Anda memerlukan konsep untuk membuat objek baru dengan status konsisten "secara atomis" - mulai dari alokasi memori (jika diperlukan) hingga inisialisasi ke keadaan bermakna (mis., Hanya memusatkan memori tidak cukup) harus dilakukan dalam satu ekspresi. Oleh karena itu seorang konstruktor diperlukan:
Tetapi ini berarti bahwa konstruktor juga dapat gagal karena beberapa kesalahan. Bagaimana menyebarkan informasi kesalahan keluar dari konstruktor tanpa pengecualian?
Nilai pengembalian? Gagal karena dalam beberapa bahasa
new
hanya dapat mengembalikannull
tetapi tidak ada informasi yang bermakna. Dalam bahasa lain (mis. C ++)myFoo
bukan pointer. Anda tidak dapat memeriksanyanull
. Anda juga tidak dapat bertanyamyFoo
tentang kesalahan - itu tidak diinisialisasi dan karena itu "tidak ada" dalam pemikiran OOP.Bendera kesalahan global? Begitu banyak tentang negara enkapsulasi dan kemudian beberapa variabel global? Pergi ke h ... ;-)
Campuran? Tidak mungkin lebih baik.
?
Jadi pengecualian adalah konsep yang lebih mendasar daripada OOP tetapi OOP dibangun di atas mereka secara alami.
sumber
Tidak. Pengecualian dan OOP tidak terkait.
Penanganan pengecualian adalah mekanisme untuk menangani kesalahan. Pengecualian ditangani dengan menyimpan kondisi eksekusi saat ini di tempat yang telah ditentukan dan mengalihkan eksekusi ke subrutin tertentu yang dikenal sebagai penangan pengecualian.
Membandingkan C ( tidak benar-benar bahasa OOP , mungkin untuk meniru bagaimana pun juga pengecualian dalam C ) dan C ++ (OOP, mendukung pengecualian), tidak ada yang mencegah komite standar C menambahkan pengecualian penanganan ke C, itu masih tidak akan menjadikan C sebagai bahasa OOP.
sumber
ON ERROR GOTO xxxx
try catch
konstruknya.Pengecualiannya adalah, sederhananya, situasi luar biasa yang membutuhkan perhatian dan seringkali perubahan dalam alur pelaksanaan program. Menurut definisi itu, pengecualian dan penanganan pengecualian tidak terbatas pada orientasi objek, dan kesalahan program sederhana dapat dianggap sebagai bentuk pengecualian.
Bahasa berorientasi objek biasanya memiliki kelas pengecualian asli, dan tergantung pada konteksnya kata "pengecualian" mungkin memang merujuk ke kelas asli itu alih-alih konsep umum. Penanganan pengecualian berorientasi objek, karena sebagian besar orientasi objek, gula sintaksis, dan dapat dengan mudah ditiru dalam bahasa yang tidak berorientasi objek. Berikut adalah contoh C, dari wikibook Pemrograman C :
sumber
Jawabannya adalah TIDAK sederhana.
Contoh yang baik untuk bahasa non-OO dengan pengecualian adalah ADA.
sumber
Beberapa jawaban yang sangat bagus sudah ada di sini. Contoh lain untuk bahasa pemrograman non-OOP yang memiliki pengecualian:
Oracle PL / SQL
klasik Visual Basic (V6 dan di bawah, "On Error Goto" adalah IMHO bentuk penanganan pengecualian)
(Untuk menjadi seluk beluk: Anda menemukan beberapa elemen OO di kedua bahasa, tetapi mekanisme penanganan pengecualian tidak memanfaatkannya, saya kira karena konsepnya diperkenalkan bertahun-tahun sebelum elemen OO ditambahkan ke bahasa-bahasa tersebut).
sumber
ON ERROR GOTO
sintaks. Bahkan QuickBASIC memiliki beberapa konsep mirip OO (saya pikir QB 4.5 bahkan mendukung beberapa jenis), tetapi Anda akan sulit sekali menyebut sebagian besar BASIC tradisional sebagai bahasa berorientasi objek yang tepat. [Wikipedia ]Ide dasar di balik pengecualian adalah untuk membersihkan aliran program sehingga programmer dapat mengikuti jalur eksekusi "normal" dengan lebih mudah. Pertimbangkan kasus sederhana membuka file dalam C. Segera setelah mencoba membuka file, programmer perlu memeriksa respons dari panggilan fopen () dan memutuskan apakah panggilan berhasil. Jika panggilan tidak berhasil, maka programmer harus merespons dengan tepat. Panggilan berikutnya di jalur eksekusi "normal", mungkin panggilan untuk menakut-nakuti () atau fwrite (), akan muncul setelah kondisi kesalahan atau kegagalan telah ditangani. Itu mungkin ada di layar berikutnya.
Dengan bahasa yang memberikan pengecualian, panggilan fopen () yang setara dapat segera diikuti oleh fread () atau fwrite (). Tidak ada penanganan kesalahan yang menyembunyikan "langkah selanjutnya" dari jalur eksekusi "normal". Programmer dapat melihat lebih banyak jalur normal pada satu layar, sehingga dapat mengikuti eksekusi dengan lebih mudah. Penanganan kesalahan dipindahkan ke bagian lain dari program.
Pengecualian itu sendiri bukanlah konsep OOP, tetapi mereka sering diimplementasikan menggunakan konsep OOP yang membuatnya lebih nyaman dan kuat. Misalnya, pengecualian dapat didefinisikan dengan hierarki warisan. Menggunakan contoh nosional kami membuka dan membaca atau menulis file, masing-masing panggilan tersebut dapat menghasilkan berbagai pengecualian - FileClosedException, DeviceFullException, NoSuchFileException, InsufficientFilePermissionsException, dll Masing-masing dapat mewarisi dari FileException, yang mungkin mewarisi dari IOException, yang mungkin mewarisi dari GenericException.
Jika programmer melakukan implementasi cepat dan kotor untuk menguji suatu konsep, ia mungkin mengabaikan penanganan pengecualian dan hanya mengimplementasikan handler tunggal untuk GenericException. Pawang itu akan menangani GenericException dan pengecualian apa pun yang mewarisi dari GenericException. Jika ia ingin memperlakukan pengecualian terkait file apa pun dengan cara yang sama, ia dapat menulis penangan untuk FileException. Itu akan dipanggil untuk FileExceptions dan pengecualian apa pun yang mewarisi dari FileException. Jika dia ingin menulis sebuah program yang akan merespons secara berbeda terhadap berbagai kondisi kesalahan, dia dapat menulis penangan khusus untuk setiap pengecualian tertentu.
sumber
Yang lain menjawab dengan benar "Tidak" dengan contoh bahasa. Saya pikir saya dapat memperluas dengan menambahkan contoh tentang cara menambahkan pengecualian ke bahasa tanpa melibatkan OOP.
Saya akan melakukan ini dalam hal DSKL (Declarative Sequential Kernel Language) dari OZ , bahasa yang cocok untuk hal-hal akademis seperti ini. DSKL (atau DKL) dapat dilihat di sini (hasil pencarian acak), bagian Pernyataan dan Nilai. Definisi yang tepat tidak penting, selain ini menjadi bahasa yang sangat sederhana tanpa variabel yang dapat dimodifikasi (mereka dideklarasikan dan kemudian diikat), dan tidak ada OOP bawaan.
OOP bahkan tidak dapat ditambahkan sebagai abstraksi linguistik ke bahasa kernel ini. Dengan menambahkan nama unik ke bahasa kernel (NewName) dan menggunakan pelingkupan lokal, enkapsulasi dapat dicapai. Atau dengan menambahkan status yang dapat diubah ke bahasa kernel (NewCell) dan menggunakan cakupan lokal OOP yang tepat dengan enkapsulasi dapat dicapai. Tetapi tidak bisa dapat dicapai dengan bahasa kernel yang ditentukan saja.
Jika kemudian kita menambahkan pengecualian ke bahasa kernel kita akan memiliki bahasa tanpa dukungan OOP tetapi memiliki pengecualian. Biarkan saya tunjukkan caranya:
Mendefinisikan mesin abstrak dengan tumpukan dan penyimpanan, kita dapat mendefinisikan apa yang harus dilakukan oleh setiap pernyataan dalam bahasa kita ( semantik pernyataan itu). Misalnya
skip
dalam stack tidak melakukan apa-apa,A = 3
dalam stack harus mengikat (/ menyatukan) A ke (/ dengan) 3.Kita mulai dengan menambahkan sintaks tentang bagaimana pengecualian kita harus didefinisikan. Kami melakukan ini dengan menambahkan dua klausa lain ke
<statement>
dalam DKL.Berikut ini adalah try / catch yang dikenal, dan cara untuk menaikkan / melempar pengecualian.
Kami mendefinisikan semantik mereka dengan bagaimana mereka harus bekerja pada mesin abstrak:
Coba
Pernyataan semantiknya adalah:
(try <statement1> catch <id> then <statement2> end)
Lakukan:
(catch <id> then <statement2> end)
(<statement1>)
Perhatikan bahwa pernyataan 1 akan berada di atas tumpukan, dan coba dieksekusi terlebih dahulu.
Naikkan
Pernyataan semantik adalah:
(raise <id> end)
Lakukan:
(catch <id> then <statement> end)
Push
(<statement>)
ke tumpukan.Tangkapan
Jika kita melihat pernyataan tangkap selama eksekusi normal, ini berarti bahwa apa pun yang ada di dalam dieksekusi tanpa menaikkan pengecualian hingga tingkat ini. Jadi kita hanya membuang
catch
tumpukan dan tidak melakukan apa pun.QED, kami memiliki bahasa dengan pengecualian dan tidak ada kemungkinan OOP.
Saya telah menghapus bagian lingkungan dari mesin abstrak untuk membuatnya lebih sederhana.
sumber
Tidak.
IIRC, pengecualian muncul sebelum bahasa OO pertama. AFAIK, pengecualian pertama kali didukung oleh implementasi LISP awal. Bahasa terstruktur awal (misalnya ALGOL) dan bahasa OO awal (mis. SIMULA) tidak mendukung pengecualian.
sumber