py: Properly implement divide-by-zero handling.

"1/0" is sacred idiom, the shortest way to break program execution
(sys.exit() is too long).
diff --git a/py/runtime.c b/py/runtime.c
index 4898864..1eca454 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -348,13 +348,20 @@
                 }
                 case MP_BINARY_OP_FLOOR_DIVIDE:
                 case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE:
-                {
+                    if (rhs_val == 0) {
+                        goto zero_division;
+                    }
                     lhs_val = python_floor_divide(lhs_val, rhs_val);
                     break;
-                }
+
                 #if MICROPY_ENABLE_FLOAT
                 case MP_BINARY_OP_TRUE_DIVIDE:
-                case MP_BINARY_OP_INPLACE_TRUE_DIVIDE: return mp_obj_new_float((mp_float_t)lhs_val / (mp_float_t)rhs_val);
+                case MP_BINARY_OP_INPLACE_TRUE_DIVIDE:
+                    if (rhs_val == 0) {
+zero_division:
+                        nlr_jump(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "division by zero"));
+                    }
+                    return mp_obj_new_float((mp_float_t)lhs_val / (mp_float_t)rhs_val);
                 #endif
 
                 case MP_BINARY_OP_MODULO:
diff --git a/tests/basics/float1.py b/tests/basics/float1.py
index 200d955..bf1305c 100644
--- a/tests/basics/float1.py
+++ b/tests/basics/float1.py
@@ -1,3 +1,16 @@
 # basic float
 x = 1 / 2
 print(x)
+
+print(1.0 // 2)
+print(2.0 // 2)
+
+try:
+    1.0 / 0
+except ZeroDivisionError:
+    print("ZeroDivisionError")
+
+try:
+    1.0 // 0
+except ZeroDivisionError:
+    print("ZeroDivisionError")
diff --git a/tests/basics/int-divzero.py b/tests/basics/int-divzero.py
new file mode 100644
index 0000000..d1fc579
--- /dev/null
+++ b/tests/basics/int-divzero.py
@@ -0,0 +1,9 @@
+try:
+    1 / 0
+except ZeroDivisionError:
+    print("ZeroDivisionError")
+
+try:
+    1 // 0
+except ZeroDivisionError:
+    print("ZeroDivisionError")