A Ruby kivételkezelése a Javáéhoz hasonló. A kivételek paramétere egy string lehet, mely csak abban az esetben informatív, ha a program futását megszakítja. Ebben az esetben kiírásra kerül. A kivételeknek az Exception osztályban definiált to_s, to_str vagy message metódusával kinyerhető a string paraméter, így benne más információ is szállítható.
Saját kivételt egyszerűen az Exception osztályból való örökléssel hozhatunk létre. Alprogramok által kiváltható kivétellista nem definiálható.
A meglevő kivételosztályok közül bármelyiket kiválthatjuk a raise kulcsszóval. A raise-nek több formája is használható. Paraméter nélküli formában az utolsó kivétel ismételt kiváltását fogja eredményezni. String paraméterrel egy Runtime Error-t vált ki, ahol is a string a kivétel paramétere és természetesen megjeleníti az interpreter. A raise után egy kivétel neve, azaz egy kivételosztály neve is állhat, ilyenkor értelemszerűen a megnevezett kivételt fogja kiváltani. Kivétel kiváltásakor a $! változóba kerül egy az adott Exception példányra mutató hivatkozás.
Példa:
A kivételkezelés az utasításblokkok szintjén működik. A begin-end blokk végén elhelyezhető egy rescue rész, így a begin és a rescue között kiváltódott kivételeket a rescue és az end között lehet lekezelni. A blokknak lehet ensure záradéka is, ami a blokk befejeztével feltétlenül végrehajtható kódot tartalmazhatja:
A párhuzamos végrehajtásból fakadó hibákat a ThreadError jelzi. Párhuzamos program esetén a felhasználó által küldött szignáloknak megfelelő kivételek a fő szálban váltódnak ki, mert a fő szál terminálása maga után vonja a többi végrehajtási szál befejeződését. A váratlan kivételek terminálják a programot, és megjelenítik a kivétel paramétereként megadott stringet. Kivétel a kivételkezelőben is kiváltható, és nem csak a paraméter nélküli raise formával, hanem ez a kezelt kivételtől eltérő kivétel is lehet. A kivételkezelőben kiváltott kivételeket a magasabb szinten levő kivételkezelő fogja lekezelni.