123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Software Entwicklung \n",
- "\n",
- "## Kapitel 7: Ausnahmebehandlung und Paketverwaltung"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "### 7.1 Exceptions\n",
- "\n",
- "#### 7.1.1 Was sind Exceptions?\n",
- "\n",
- "Immer wieder treten bei der Ausführung von Python-Code Fehler auf. Das kann auf fehlerhafte\n",
- "Programmierung hindeuten, z.B. bei folgendem Code:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "liste = []\n",
- "print(liste[0])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Solche Programmierfehler sollten natürlich vermieden werden.\n",
- "\n",
- "Manchmal ist der Entwickler aber unschuldig, z.B. wenn der Plattenplatz zum Speichern nicht \n",
- "mehr ausreicht oder der Anwender ungültige Werte eingibt. Solche Laufzeitfehler führen zu\n",
- "Ausnahmen oder *Exceptions*."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "zaehler = int(input(\"Zähler: \"))\n",
- "nenner = int(input(\"Nenner: \"))\n",
- "print(zaehler/nenner)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "pycharm": {
- "name": "#%% md\n"
- },
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Manche dieser Exceptions können auch durch vorheriges Überprüfen nicht vollständig\n",
- "ausgeschlossen werden (z.B. Abbruch einer Netzverbindung). Wie kann trotzdem verhindert werden,\n",
- "dass das Programm abbricht?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "#### 7.1.2 Fangen von Exceptions\n",
- "\n",
- "Ein Programmabruch kann verhindert werden, indem man den kritischen Codeblock mittels\n",
- "<code>try</code> absichert und anschließend mit <code>except</code> angibt, was im\n",
- "Falle einer Exception zu tun ist."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "try:\n",
- " zaehler = int(input(\"Zähler: \"))\n",
- " nenner = int(input(\"Nenner: \"))\n",
- " print(zaehler/nenner)\n",
- "except:\n",
- " print(\"Ungültige Eingaben!\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Es ist auch möglich, genauere Informationen über die aufgetretene Exception zu erhalten, indem\n",
- "sie einer Variablen zugewiesen wird."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "try:\n",
- " zaehler = int(input(\"Zähler: \"))\n",
- " nenner = int(input(\"Nenner: \"))\n",
- " print(zaehler/nenner)\n",
- "except Exception as e:\n",
- " print(e.__class__)\n",
- " print(e)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Möchte man unterschiedliche Behandlungen für unterschiedliche Exception-Klassen\n",
- "hinterlegen, so können mehrere <code>except</code>-Blöcke mit Angabe der Klasse\n",
- "verwendet werden."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "try:\n",
- " zaehler = int(input(\"Zähler: \"))\n",
- " nenner = int(input(\"Nenner: \"))\n",
- " print(zaehler/nenner)\n",
- "except ValueError:\n",
- " print(\"Sie haben keine ganze Zahl eingegeben\")\n",
- "except ZeroDivisionError:\n",
- " print(\"Divison durch Null\")\n",
- "except:\n",
- " print(\"Irgendwas anderes\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "pycharm": {
- "name": "#%% md\n"
- },
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Die Programmausführung wird nach dem letzten <code>except</code> normal fortgesetzt.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "def division(z, n):\n",
- " try:\n",
- " zaehler = int(z)\n",
- " nenner = int(n)\n",
- " return zaehler / nenner\n",
- " except:\n",
- " print(\"Fehler!\")\n",
- " return None\n",
- "\n",
- "division(1, 0)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Gelegentlich möchte man nach dem <code>try</code>-Block noch Aufräumarbeiten durchführen\n",
- "ohne zu berücksichtigen, ob ein Fehler aufgetreten ist. Das kann durch <code>finally</code>\n",
- "erreicht werden."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "def division(z, n):\n",
- " try:\n",
- " zaehler = int(z)\n",
- " nenner = int(n)\n",
- " return zaehler / nenner\n",
- " except:\n",
- " print(\"Fehler!\")\n",
- " finally:\n",
- " print(\"Aufräumen\")\n",
- " return None\n",
- "\n",
- "division(1, 2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Nach einem <code>try</code>-Block muss\n",
- "\n",
- "* entweder mindestens ein <code>except</code>-Block\n",
- "* oder der <code>finally</code>-Block\n",
- "* oder beides\n",
- "\n",
- "angegeben werden."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "#### 7.1.3 Werfen von Exceptions\n",
- "\n",
- "Gelegentlich möchte man auch selbst eine Exception auslösen, wenn man eine\n",
- "unzulässige Situation entdeckt. Der Python-Befehl hierzu lautet <code>raise</code>."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "def division(z, n):\n",
- " if n == 0:\n",
- " raise Exception(\"Division durch Null nicht erlaubt!\")\n",
- " return z/n\n",
- "\n",
- "division(1, 0)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "pycharm": {
- "name": "#%% md\n"
- },
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Neben der allgemeinen <code>Exception</code> beinhaltet der Python-Standard noch eine\n",
- "Vielzahl weiterer [Exception-Klassen](https://docs.python.org/3/library/exceptions.html#exception-hierarchy),\n",
- "die auch beim Werfen einer Exception genutzt werden können."
- ]
- }
- ],
- "metadata": {
- "celltoolbar": "Slideshow",
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
- }
|