diff --git a/drivers/dht/dht.c b/drivers/dht/dht.c
index 6bdda44b46998796024b8d9ae15459be4180feab..5d92ae39a33261f7f92b641d801595afa170e8bd 100644
--- a/drivers/dht/dht.c
+++ b/drivers/dht/dht.c
@@ -40,7 +40,7 @@ STATIC mp_obj_t dht_readinto(mp_obj_t pin_in, mp_obj_t buf_in) {
     mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_WRITE);
 
     if (bufinfo.len < 5) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "buffer too small"));
+        mp_raise_ValueError("buffer too small");
     }
 
     // issue start command
diff --git a/esp8266/machine_hspi.c b/esp8266/machine_hspi.c
index 1be342b526299134d0b5d6442ab7075c9d55adfd..eaabbab7ead2d7526d5d0553ab5fba671b4615d7 100644
--- a/esp8266/machine_hspi.c
+++ b/esp8266/machine_hspi.c
@@ -122,15 +122,13 @@ STATIC void machine_hspi_init(mp_obj_base_t *self_in, size_t n_args, const mp_ob
         spi_init_gpio(HSPI, SPI_CLK_80MHZ_NODIV);
         spi_clock(HSPI, 0, 0);
     } else if (self->baudrate > 40000000L) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-            "impossible baudrate"));
+        mp_raise_ValueError("impossible baudrate");
     } else {
         uint32_t divider = 40000000L / self->baudrate;
         uint16_t prediv = MIN(divider, SPI_CLKDIV_PRE + 1);
         uint16_t cntdiv = (divider / prediv) * 2; // cntdiv has to be even
         if (cntdiv > SPI_CLKCNT_N + 1 || cntdiv == 0 || prediv == 0) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-                "impossible baudrate"));
+            mp_raise_ValueError("impossible baudrate");
         }
         self->baudrate = 80000000L / (prediv * cntdiv);
         spi_init_gpio(HSPI, SPI_CLK_USE_DIV);
diff --git a/esp8266/machine_pin.c b/esp8266/machine_pin.c
index de65735ba78dd7aaa6aed57555ba0151cb755f70..673082065b6e1ed4ff21a420478ffe701481eb3c 100644
--- a/esp8266/machine_pin.c
+++ b/esp8266/machine_pin.c
@@ -125,7 +125,7 @@ void pin_intr_handler(uint32_t status) {
 
 pyb_pin_obj_t *mp_obj_get_pin_obj(mp_obj_t pin_in) {
     if (mp_obj_get_type(pin_in) != &pyb_pin_type) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "expecting a pin"));
+        mp_raise_ValueError("expecting a pin");
     }
     pyb_pin_obj_t *self = pin_in;
     return self;
@@ -280,7 +280,7 @@ STATIC mp_obj_t pyb_pin_obj_init_helper(pyb_pin_obj_t *self, mp_uint_t n_args, c
         // only pull-down seems to be supported by the hardware, and
         // we only expose pull-up behaviour in software
         if (pull != GPIO_PULL_NONE) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Pin(16) doesn't support pull"));
+            mp_raise_ValueError("Pin(16) doesn't support pull");
         }
     } else {
         PIN_FUNC_SELECT(self->periph, self->func);
@@ -319,7 +319,7 @@ mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
         pin = (pyb_pin_obj_t*)&pyb_pin_obj[wanted_pin];
     }
     if (pin == NULL || pin->base.type == NULL) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid pin"));
+        mp_raise_ValueError("invalid pin");
     }
 
     if (n_args > 1 || n_kw > 0) {
diff --git a/esp8266/machine_rtc.c b/esp8266/machine_rtc.c
index 2ad44318f2f8b9c84f75899d87e25e504af1eff0..c5d04e0cfa1af6e36f7d02b7aeb0243b1ac45c43 100644
--- a/esp8266/machine_rtc.c
+++ b/esp8266/machine_rtc.c
@@ -183,8 +183,7 @@ STATIC mp_obj_t pyb_rtc_memory(mp_uint_t n_args, const mp_obj_t *args) {
         mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
 
         if (bufinfo.len > MEM_USER_MAXLEN) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-                "buffer too long"));
+            mp_raise_ValueError("buffer too long");
         }
 
         len = bufinfo.len;
@@ -208,7 +207,7 @@ STATIC mp_obj_t pyb_rtc_alarm(mp_obj_t self_in, mp_obj_t alarm_id, mp_obj_t time
 
     // check we want alarm0
     if (mp_obj_get_int(alarm_id) != 0) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid alarm"));
+        mp_raise_ValueError("invalid alarm");
     }
 
     // set expiry time (in microseconds)
@@ -245,7 +244,7 @@ STATIC mp_obj_t pyb_rtc_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k
 
     // check we want alarm0
     if (args[ARG_trigger].u_int != 0) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid alarm"));
+        mp_raise_ValueError("invalid alarm");
     }
 
     // set the wake value
diff --git a/esp8266/modesp.c b/esp8266/modesp.c
index a63d505645f4f0ef3baa5596a051a189ac5120a6..6ddca0733b92cae69806182fbb5c9f16e8b333bd 100644
--- a/esp8266/modesp.c
+++ b/esp8266/modesp.c
@@ -118,7 +118,7 @@ STATIC mp_obj_t esp_flash_write(mp_obj_t offset_in, const mp_obj_t buf_in) {
     mp_buffer_info_t bufinfo;
     mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
     if (bufinfo.len & 0x3) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "len must be multiple of 4"));
+        mp_raise_ValueError("len must be multiple of 4");
     }
     SpiFlashOpResult res = spi_flash_write(offset, bufinfo.buf, bufinfo.len);
     if (res == SPI_FLASH_RESULT_OK) {
diff --git a/esp8266/modmachine.c b/esp8266/modmachine.c
index 070e6fc54cc7812c1dfae4f48e8ee9154d183776..98bc4955869d642d64aeb825b0cfddfbfd9152f6 100644
--- a/esp8266/modmachine.c
+++ b/esp8266/modmachine.c
@@ -59,8 +59,7 @@ STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) {
         // set
         mp_int_t freq = mp_obj_get_int(args[0]) / 1000000;
         if (freq != 80 && freq != 160) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-                    "frequency can only be either 80Mhz or 160MHz"));
+            mp_raise_ValueError("frequency can only be either 80Mhz or 160MHz");
         }
         system_update_cpu_freq(freq);
         return mp_const_none;
diff --git a/esp8266/modnetwork.c b/esp8266/modnetwork.c
index 283abecafefe81c59316917e804d4df1ad18f018..b893209c659c0415405dd7e16c4593f71c9b19ed 100644
--- a/esp8266/modnetwork.c
+++ b/esp8266/modnetwork.c
@@ -275,8 +275,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_ifconfig_obj, 1, 2, esp_ifconfig)
 
 STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
     if (n_args != 1 && kwargs->used != 0) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
-            "either pos or kw args are allowed"));
+        mp_raise_TypeError("either pos or kw args are allowed");
     }
 
     wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
@@ -303,8 +302,7 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
                         mp_buffer_info_t bufinfo;
                         mp_get_buffer_raise(kwargs->table[i].value, &bufinfo, MP_BUFFER_READ);
                         if (bufinfo.len != 6) {
-                            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-                                "invalid buffer length"));
+                            mp_raise_ValueError("invalid buffer length");
                         }
                         wifi_set_macaddr(self->if_id, bufinfo.buf);
                         break;
@@ -374,8 +372,7 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
     // Get config
 
     if (n_args != 2) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
-            "can query only one param"));
+        mp_raise_TypeError("can query only one param");
     }
 
     mp_obj_t val;
@@ -422,8 +419,7 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
     return val;
 
 unknown:
-    nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-        "unknown config param"));
+    mp_raise_ValueError("unknown config param");
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(esp_config_obj, 1, esp_config);
 
diff --git a/extmod/modlwip.c b/extmod/modlwip.c
index bde251ccac9024e36612c692d3b31e483a1d954d..cc10523e54b8e99776bdbcac5031a0f898a296d3 100644
--- a/extmod/modlwip.c
+++ b/extmod/modlwip.c
@@ -129,15 +129,15 @@ STATIC mp_obj_t lwip_slip_make_new(mp_obj_t type_in, size_t n_args, size_t n_kw,
 
     ip_addr_t iplocal, ipremote;
     if (!ipaddr_aton(mp_obj_str_get_str(args[1]), &iplocal)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "not a valid local IP"));
+        mp_raise_ValueError("not a valid local IP");
     }
     if (!ipaddr_aton(mp_obj_str_get_str(args[2]), &ipremote)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "not a valid remote IP"));
+        mp_raise_ValueError("not a valid remote IP");
     }
 
     struct netif *n = &lwip_slip_obj.lwip_netif;
     if (netif_add(n, &iplocal, IP_ADDR_BROADCAST, &ipremote, NULL, slipif_init, ip_input) == NULL) {
-       nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "out of memory"));
+       mp_raise_ValueError("out of memory");
     }
     netif_set_up(n);
     netif_set_default(n);
@@ -1033,7 +1033,7 @@ STATIC mp_obj_t lwip_socket_sendall(mp_obj_t self_in, mp_obj_t buf_in) {
             break;
         }
         case MOD_NETWORK_SOCK_DGRAM:
-            mp_not_implemented("");
+            mp_raise_NotImplementedError("");
             break;
     }
 
diff --git a/extmod/modubinascii.c b/extmod/modubinascii.c
index d79191b3e5d5d919c3575511bac57357f0a62d70..d3092a4df1bd061b246416791ad416a0499f0692 100644
--- a/extmod/modubinascii.c
+++ b/extmod/modubinascii.c
@@ -109,7 +109,7 @@ mp_obj_t mod_binascii_a2b_base64(mp_obj_t data) {
     mp_buffer_info_t bufinfo;
     mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ);
     if (bufinfo.len % 4 != 0) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "incorrect padding"));
+        mp_raise_ValueError("incorrect padding");
     }
 
     vstr_t vstr;
@@ -136,11 +136,11 @@ mp_obj_t mod_binascii_a2b_base64(mp_obj_t data) {
                 hold[j] = 63;
             } else if (in[j] == '=') {
                 if (j < 2 || i > 4) {
-                    nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "incorrect padding"));
+                    mp_raise_ValueError("incorrect padding");
                 }
                 hold[j] = 64;
             } else {
-                nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid character"));
+                mp_raise_ValueError("invalid character");
             }
         }
         in += 4;
diff --git a/extmod/moductypes.c b/extmod/moductypes.c
index c2d2265628105f4cd6cac20218daf2649f5e177d..dc03f6de5041f41618ba41cb08dad88187727227 100644
--- a/extmod/moductypes.c
+++ b/extmod/moductypes.c
@@ -118,7 +118,7 @@ typedef struct _mp_obj_uctypes_struct_t {
 } mp_obj_uctypes_struct_t;
 
 STATIC NORETURN void syntax_error(void) {
-    nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "syntax error in uctypes descriptor"));
+    mp_raise_TypeError("syntax error in uctypes descriptor");
 }
 
 STATIC mp_obj_t uctypes_struct_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
@@ -215,7 +215,7 @@ STATIC mp_uint_t uctypes_struct_size(mp_obj_t desc_in, int layout_type, mp_uint_
             // but scalar structure field is lowered into native Python int, so all
             // type info is lost. So, we cannot say if it's scalar type description,
             // or such lowered scalar.
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "Cannot unambiguously get sizeof scalar"));
+            mp_raise_TypeError("Cannot unambiguously get sizeof scalar");
         }
         syntax_error();
     }
@@ -393,7 +393,7 @@ STATIC mp_obj_t uctypes_struct_attr_op(mp_obj_t self_in, qstr attr, mp_obj_t set
 
     // TODO: Support at least OrderedDict in addition
     if (!MP_OBJ_IS_TYPE(self->desc, &mp_type_dict)) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "struct: no fields"));
+            mp_raise_TypeError("struct: no fields");
     }
 
     mp_obj_t deref = mp_obj_dict_get(self->desc, MP_OBJ_NEW_QSTR(attr));
@@ -526,7 +526,7 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
     } else {
         // load / store
         if (!MP_OBJ_IS_TYPE(self->desc, &mp_type_tuple)) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "struct: cannot index"));
+            mp_raise_TypeError("struct: cannot index");
         }
 
         mp_obj_tuple_t *t = MP_OBJ_TO_PTR(self->desc);
diff --git a/extmod/moduheapq.c b/extmod/moduheapq.c
index e6e417d2bcdfce7d1505d07955af36d91dc534f4..4a620bad8185f0aa01e809899ae3a9bc132697f5 100644
--- a/extmod/moduheapq.c
+++ b/extmod/moduheapq.c
@@ -35,7 +35,7 @@
 
 STATIC mp_obj_list_t *get_heap(mp_obj_t heap_in) {
     if (!MP_OBJ_IS_TYPE(heap_in, &mp_type_list)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "heap must be a list"));
+        mp_raise_TypeError("heap must be a list");
     }
     return MP_OBJ_TO_PTR(heap_in);
 }
diff --git a/extmod/modujson.c b/extmod/modujson.c
index f94ec7db885bf5d522e287c2a7a0a3f0a990937d..6c4aa1611d5f3bb6f8bf85a8eccf0851da42d5ea 100644
--- a/extmod/modujson.c
+++ b/extmod/modujson.c
@@ -269,7 +269,7 @@ STATIC mp_obj_t mod_ujson_load(mp_obj_t stream_obj) {
     return stack_top;
 
     fail:
-    nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "syntax error in JSON"));
+    mp_raise_ValueError("syntax error in JSON");
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_load_obj, mod_ujson_load);
 
diff --git a/extmod/modure.c b/extmod/modure.c
index b85ba267373e999f3a719576217d964812df2144..2baebdecc678ffed03c4b9d44dccc213a0222265 100644
--- a/extmod/modure.c
+++ b/extmod/modure.c
@@ -156,7 +156,7 @@ STATIC mp_obj_t re_split(size_t n_args, const mp_obj_t *args) {
         mp_obj_t s = mp_obj_new_str_of_type(str_type, (const byte*)subj.begin, caps[0] - subj.begin);
         mp_obj_list_append(retval, s);
         if (self->re.sub > 0) {
-            mp_not_implemented("Splitting with sub-captures");
+            mp_raise_NotImplementedError("Splitting with sub-captures");
         }
         subj.begin = caps[1];
         if (maxsplit > 0 && --maxsplit == 0) {
@@ -200,7 +200,7 @@ STATIC mp_obj_t mod_re_compile(size_t n_args, const mp_obj_t *args) {
     int error = re1_5_compilecode(&o->re, re_str);
     if (error != 0) {
 error:
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Error in regex"));
+        mp_raise_ValueError("Error in regex");
     }
     if (flags & FLAG_DEBUG) {
         re1_5_dumpcode(&o->re);
diff --git a/extmod/modussl_axtls.c b/extmod/modussl_axtls.c
index 86dd8e29c81de67a950b2b668fd7da53df7e9adb..b5d2412d260e11d2a5a8678f81c16157dbcf168f 100644
--- a/extmod/modussl_axtls.c
+++ b/extmod/modussl_axtls.c
@@ -153,7 +153,7 @@ STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
     // Currently supports only blocking mode
     (void)self_in;
     if (!mp_obj_is_true(flag_in)) {
-        mp_not_implemented("");
+        mp_raise_NotImplementedError("");
     }
     return mp_const_none;
 }
diff --git a/extmod/moduzlib.c b/extmod/moduzlib.c
index a05d0f2ed05ea1102d6bde2d6d21c23df0fa2c99..b446dba73771705de7aee9a96f0ffc357acf407c 100644
--- a/extmod/moduzlib.c
+++ b/extmod/moduzlib.c
@@ -92,7 +92,7 @@ STATIC mp_obj_t decompio_make_new(const mp_obj_type_t *type, size_t n_args, size
         dict_opt = uzlib_zlib_parse_header(&o->decomp);
         if (dict_opt < 0) {
 header_error:
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "compression header"));
+            mp_raise_ValueError("compression header");
         }
         dict_sz = 1 << dict_opt;
     } else {
diff --git a/lib/netutils/netutils.c b/lib/netutils/netutils.c
index a324521613d11b4871ece7333f40c498c90926ec..15e70397cb8a29e01eaf8a73b02d8e059f11590b 100644
--- a/lib/netutils/netutils.c
+++ b/lib/netutils/netutils.c
@@ -31,6 +31,7 @@
 
 #include "py/obj.h"
 #include "py/nlr.h"
+#include "py/runtime.h"
 #include "lib/netutils/netutils.h"
 
 // Takes an array with a raw IPv4 address and returns something like '192.168.0.1'.
@@ -80,7 +81,7 @@ void netutils_parse_ipv4_addr(mp_obj_t addr_in, uint8_t *out_ip, netutils_endian
         } else if (i > 0 && s < s_top && *s == '.') {
             s++;
         } else {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid arguments"));
+            mp_raise_ValueError("invalid arguments");
         }
     }
 }
diff --git a/py/argcheck.c b/py/argcheck.c
index 22fd9cd2c7cd790cb7b91ff6b00a4b28536c6c3e..0c5c5ca95405810821018721f8f0f2a3668a1ed8 100644
--- a/py/argcheck.c
+++ b/py/argcheck.c
@@ -142,6 +142,6 @@ NORETURN void mp_arg_error_terse_mismatch(void) {
 
 #if MICROPY_CPYTHON_COMPAT
 NORETURN void mp_arg_error_unimpl_kw(void) {
-    mp_not_implemented("keyword argument(s) not yet implemented - use normal args instead");
+    mp_raise_NotImplementedError("keyword argument(s) not yet implemented - use normal args instead");
 }
 #endif
diff --git a/py/emitnative.c b/py/emitnative.c
index 5ed69ff9b0ca2315729173c218cfa22135e76cb7..7ce61962540d8cfc983fe31d9bba9193fbc201a7 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -824,7 +824,7 @@ STATIC void emit_get_stack_pointer_to_reg_for_pop(emit_t *emit, mp_uint_t reg_de
                     break;
                 default:
                     // not handled
-                    mp_not_implemented("conversion to object");
+                    mp_raise_NotImplementedError("conversion to object");
             }
         }
 
@@ -2158,7 +2158,7 @@ STATIC void emit_native_call_function(emit_t *emit, mp_uint_t n_positional, mp_u
                 break;
             default:
                 // this can happen when casting a cast: int(int)
-                mp_not_implemented("casting");
+                mp_raise_NotImplementedError("casting");
         }
     } else {
         assert(vtype_fun == VTYPE_PYOBJ);
@@ -2232,12 +2232,12 @@ STATIC void emit_native_raise_varargs(emit_t *emit, mp_uint_t n_args) {
 STATIC void emit_native_yield_value(emit_t *emit) {
     // not supported (for now)
     (void)emit;
-    mp_not_implemented("native yield");
+    mp_raise_NotImplementedError("native yield");
 }
 STATIC void emit_native_yield_from(emit_t *emit) {
     // not supported (for now)
     (void)emit;
-    mp_not_implemented("native yield from");
+    mp_raise_NotImplementedError("native yield from");
 }
 
 STATIC void emit_native_start_except_handler(emit_t *emit) {
diff --git a/py/lexer.c b/py/lexer.c
index 32b3567cc23f3630f8fba9ecb45e53ad12bd0b9c..074d6f35616da85021ceb12dda7e929a7cea41ff 100644
--- a/py/lexer.c
+++ b/py/lexer.c
@@ -341,7 +341,7 @@ STATIC void parse_string_literal(mp_lexer_t *lex, bool is_raw) {
                             // 3MB of text; even gzip-compressed and with minimal structure, it'll take
                             // roughly half a meg of storage. This form of Unicode escape may be added
                             // later on, but it's definitely not a priority right now. -- CJA 20140607
-                            mp_not_implemented("unicode name escapes");
+                            mp_raise_NotImplementedError("unicode name escapes");
                             break;
                         default:
                             if (c >= '0' && c <= '7') {
diff --git a/py/objarray.c b/py/objarray.c
index 99146bd4c170f6e10bdf0568c68a56667ba0cb14..a31c5368046411c29fc85dcdef5eb60a9f1fdb3f 100644
--- a/py/objarray.c
+++ b/py/objarray.c
@@ -288,7 +288,7 @@ STATIC mp_obj_t array_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in)
 
             // Otherwise, can only look for a scalar numeric value in an array
             if (MP_OBJ_IS_INT(rhs_in) || mp_obj_is_float(rhs_in)) {
-                mp_not_implemented("");
+                mp_raise_NotImplementedError("");
             }
 
             return mp_const_false;
@@ -378,7 +378,7 @@ STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value
         } else if (MP_OBJ_IS_TYPE(index_in, &mp_type_slice)) {
             mp_bound_slice_t slice;
             if (!mp_seq_get_fast_slice_indexes(o->len, index_in, &slice)) {
-                mp_not_implemented("only slices with step=1 (aka None) are supported");
+                mp_raise_NotImplementedError("only slices with step=1 (aka None) are supported");
             }
             if (value != MP_OBJ_SENTINEL) {
                 #if MICROPY_PY_ARRAY_SLICE_ASSIGN
@@ -409,7 +409,7 @@ STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value
                     src_len = bufinfo.len;
                     src_items = bufinfo.buf;
                 } else {
-                    mp_not_implemented("array/bytes required on right side");
+                    mp_raise_NotImplementedError("array/bytes required on right side");
                 }
 
                 // TODO: check src/dst compat
diff --git a/py/objlist.c b/py/objlist.c
index 5957c9d4ad40a9294af62e81b29ea29717ce3266..86d4300620c07f990c80829319cb0230808bb683 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -162,7 +162,7 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
             mp_obj_list_t *self = MP_OBJ_TO_PTR(self_in);
             mp_bound_slice_t slice;
             if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice)) {
-                mp_not_implemented("");
+                mp_raise_NotImplementedError("");
             }
 
             mp_int_t len_adj = slice.start - slice.stop;
@@ -202,7 +202,7 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
             mp_obj_get_array(value, &value_len, &value_items);
             mp_bound_slice_t slice_out;
             if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice_out)) {
-                mp_not_implemented("");
+                mp_raise_NotImplementedError("");
             }
             mp_int_t len_adj = value_len - (slice_out.stop - slice_out.start);
             //printf("Len adj: %d\n", len_adj);
diff --git a/py/objstr.c b/py/objstr.c
index cc3dda59e5163b2f94e20d599b73311e185f082b..d4c038a686d84e8549ec3c2064851620f55b0236 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -404,7 +404,7 @@ STATIC mp_obj_t bytes_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
         if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
             mp_bound_slice_t slice;
             if (!mp_seq_get_fast_slice_indexes(self_len, index, &slice)) {
-                mp_not_implemented("only slices with step=1 (aka None) are supported");
+                mp_raise_NotImplementedError("only slices with step=1 (aka None) are supported");
             }
             return mp_obj_new_str_of_type(type, self_data + slice.start, slice.stop - slice.start);
         }
@@ -618,7 +618,7 @@ STATIC mp_obj_t str_rsplit(size_t n_args, const mp_obj_t *args) {
     mp_int_t idx = splits;
 
     if (sep == mp_const_none) {
-        mp_not_implemented("rsplit(None,n)");
+        mp_raise_NotImplementedError("rsplit(None,n)");
     } else {
         size_t sep_len;
         const char *sep_str = mp_obj_str_get_data(sep, &sep_len);
@@ -742,7 +742,7 @@ STATIC mp_obj_t str_endswith(size_t n_args, const mp_obj_t *args) {
     GET_STR_DATA_LEN(args[0], str, str_len);
     GET_STR_DATA_LEN(args[1], suffix, suffix_len);
     if (n_args > 2) {
-        mp_not_implemented("start/end indices");
+        mp_raise_NotImplementedError("start/end indices");
     }
 
     if (suffix_len > str_len) {
@@ -1044,7 +1044,7 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
                 arg = key_elem->value;
             }
             if (field_name < field_name_top) {
-                mp_not_implemented("attributes not supported yet");
+                mp_raise_NotImplementedError("attributes not supported yet");
             }
         } else {
             if (*arg_i < 0) {
diff --git a/py/objstrunicode.c b/py/objstrunicode.c
index 0cf791ff7c4d5c2c9ae14a97dfe9ca7e979168a5..036f7f3c142cf4adf4935818663abc7d1d954969 100644
--- a/py/objstrunicode.c
+++ b/py/objstrunicode.c
@@ -188,7 +188,7 @@ STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
             mp_obj_t ostart, ostop, ostep;
             mp_obj_slice_get(index, &ostart, &ostop, &ostep);
             if (ostep != mp_const_none && ostep != MP_OBJ_NEW_SMALL_INT(1)) {
-                mp_not_implemented("only slices with step=1 (aka None) are supported");
+                mp_raise_NotImplementedError("only slices with step=1 (aka None) are supported");
             }
 
             const byte *pstart, *pstop;
diff --git a/py/objtuple.c b/py/objtuple.c
index cbe64549435c2fd0be2ade53eafc6a42ca4f0667..765edb907c978740a70bb282f31132f0d937cbb5 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -181,7 +181,7 @@ mp_obj_t mp_obj_tuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
         if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
             mp_bound_slice_t slice;
             if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice)) {
-                mp_not_implemented("only slices with step=1 (aka None) are supported");
+                mp_raise_NotImplementedError("only slices with step=1 (aka None) are supported");
             }
             mp_obj_tuple_t *res = MP_OBJ_TO_PTR(mp_obj_new_tuple(slice.stop - slice.start, NULL));
             mp_seq_copy(res->items, self->items + slice.start, res->len, mp_obj_t);
diff --git a/py/runtime.c b/py/runtime.c
index 6a0db007e34b913d5e17184c5d20973fceb56746..9c3edeb9c805b7365985e9c8ec8cad591864b4a2 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -1439,6 +1439,6 @@ NORETURN void mp_raise_OSError(int errno_) {
     nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno_)));
 }
 
-NORETURN void mp_not_implemented(const char *msg) {
+NORETURN void mp_raise_NotImplementedError(const char *msg) {
     mp_raise_msg(&mp_type_NotImplementedError, msg);
 }
diff --git a/py/runtime.h b/py/runtime.h
index fe492885b15a881de8fccf2c81900d49fcb1866d..428e2571cc8cacb6e76ef47d4816094db185682e 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -149,8 +149,8 @@ NORETURN void mp_raise_msg(const mp_obj_type_t *exc_type, const char *msg);
 //NORETURN void nlr_raise_msg_varg(const mp_obj_type_t *exc_type, const char *fmt, ...);
 NORETURN void mp_raise_ValueError(const char *msg);
 NORETURN void mp_raise_TypeError(const char *msg);
+NORETURN void mp_raise_NotImplementedError(const char *msg);
 NORETURN void mp_raise_OSError(int errno_);
-NORETURN void mp_not_implemented(const char *msg); // Raise NotImplementedError with given message
 NORETURN void mp_exc_recursion_depth(void);
 
 #if MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG
diff --git a/stmhal/dac.c b/stmhal/dac.c
index cdb3a9bcd710b8b495a2eca26fdef17a93880160..14bd59b41aad238dee7b97b55ed19e7032ea02ec 100644
--- a/stmhal/dac.c
+++ b/stmhal/dac.c
@@ -119,7 +119,7 @@ STATIC uint32_t TIMx_Config(mp_obj_t timer) {
         return DAC_TRIGGER_T8_TRGO;
     #endif
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Timer does not support DAC triggering"));
+        mp_raise_ValueError("Timer does not support DAC triggering");
     }
 }
 
diff --git a/stmhal/i2c.c b/stmhal/i2c.c
index 3fcce327f4de5f55fb08b392b3d6aad568aa84ea..48a1e49af8a4ca06bcd49cf11a0e8bab601788e7 100644
--- a/stmhal/i2c.c
+++ b/stmhal/i2c.c
@@ -670,7 +670,7 @@ STATIC mp_obj_t pyb_i2c_is_ready(mp_obj_t self_in, mp_obj_t i2c_addr_o) {
     pyb_i2c_obj_t *self = self_in;
 
     if (!in_master_mode(self)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "I2C must be a master"));
+        mp_raise_TypeError("I2C must be a master");
     }
 
     mp_uint_t i2c_addr = mp_obj_get_int(i2c_addr_o) << 1;
@@ -693,7 +693,7 @@ STATIC mp_obj_t pyb_i2c_scan(mp_obj_t self_in) {
     pyb_i2c_obj_t *self = self_in;
 
     if (!in_master_mode(self)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "I2C must be a master"));
+        mp_raise_TypeError("I2C must be a master");
     }
 
     mp_obj_t list = mp_obj_new_list(0, NULL);
@@ -754,7 +754,7 @@ STATIC mp_obj_t pyb_i2c_send(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
             if (use_dma) {
                 dma_deinit(self->tx_dma_descr);
             }
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "addr argument required"));
+            mp_raise_TypeError("addr argument required");
         }
         mp_uint_t i2c_addr = args[1].u_int << 1;
         if (!use_dma) {
@@ -830,7 +830,7 @@ STATIC mp_obj_t pyb_i2c_recv(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
     HAL_StatusTypeDef status;
     if (in_master_mode(self)) {
         if (args[1].u_int == PYB_I2C_MASTER_ADDRESS) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "addr argument required"));
+            mp_raise_TypeError("addr argument required");
         }
         mp_uint_t i2c_addr = args[1].u_int << 1;
         if (!use_dma) {
@@ -897,7 +897,7 @@ STATIC mp_obj_t pyb_i2c_mem_read(mp_uint_t n_args, const mp_obj_t *pos_args, mp_
     mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(pyb_i2c_mem_read_allowed_args), pyb_i2c_mem_read_allowed_args, args);
 
     if (!in_master_mode(self)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "I2C must be a master"));
+        mp_raise_TypeError("I2C must be a master");
     }
 
     // get the buffer to read into
@@ -965,7 +965,7 @@ STATIC mp_obj_t pyb_i2c_mem_write(mp_uint_t n_args, const mp_obj_t *pos_args, mp
     mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(pyb_i2c_mem_read_allowed_args), pyb_i2c_mem_read_allowed_args, args);
 
     if (!in_master_mode(self)) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "I2C must be a master"));
+        mp_raise_TypeError("I2C must be a master");
     }
 
     // get the buffer to write from
diff --git a/stmhal/modmachine.c b/stmhal/modmachine.c
index c5444ec9807571a825adc402fd89696043f2a29d..cb7957681d0da7132e4adbc37b227c046b0bbac6 100644
--- a/stmhal/modmachine.c
+++ b/stmhal/modmachine.c
@@ -258,7 +258,7 @@ STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) {
         mp_int_t wanted_sysclk = mp_obj_get_int(args[0]) / 1000000;
 
         #if defined(MCU_SERIES_L4)
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError, "machine.freq set not supported yet"));
+        mp_raise_NotImplementedError("machine.freq set not supported yet");
         #endif
 
         // default PLL parameters that give 48MHz on PLL48CK
@@ -318,7 +318,7 @@ STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) {
                     goto set_clk;
                 }
             }
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "can't make valid freq"));
+            mp_raise_ValueError("can't make valid freq");
         }
 
     set_clk:
diff --git a/stmhal/moduos.c b/stmhal/moduos.c
index 77a60c0cbc60518e1ece25c8ddb4e08eb0508600..e02f6aefa834e2695f3d82ba1e14c1700ad89efd 100644
--- a/stmhal/moduos.c
+++ b/stmhal/moduos.c
@@ -121,7 +121,7 @@ STATIC mp_obj_t os_dupterm(mp_uint_t n_args, const mp_obj_t *args) {
         } else if (mp_obj_get_type(args[0]) == &pyb_uart_type) {
             MP_STATE_PORT(pyb_stdio_uart) = args[0];
         } else {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "need a UART object"));
+            mp_raise_ValueError("need a UART object");
         }
         return mp_const_none;
     }
diff --git a/stmhal/pin.c b/stmhal/pin.c
index 0dce0c1c08a3389dfd54c16917a049393607b6a5..8d4e8002239c92aa18e117cc0cc50c0d5a754378 100644
--- a/stmhal/pin.c
+++ b/stmhal/pin.c
@@ -120,7 +120,7 @@ const pin_obj_t *pin_find(mp_obj_t user_obj) {
         pin_obj = mp_call_function_1(MP_STATE_PORT(pin_class_mapper), user_obj);
         if (pin_obj != mp_const_none) {
             if (!MP_OBJ_IS_TYPE(pin_obj, &pin_type)) {
-                nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Pin.mapper didn't return a Pin object"));
+                mp_raise_ValueError("Pin.mapper didn't return a Pin object");
             }
             if (pin_class_debug) {
                 printf("Pin.mapper maps ");
diff --git a/stmhal/rtc.c b/stmhal/rtc.c
index 4efc56d5c8f3f9aaaa369808ee7677d6df03d0a7..6cb6ef047e9e4744110a151a6fb0de0e60591432 100644
--- a/stmhal/rtc.c
+++ b/stmhal/rtc.c
@@ -575,7 +575,7 @@ mp_obj_t pyb_rtc_wakeup(mp_uint_t n_args, const mp_obj_t *args) {
                     wut -= 0x10000;
                     if (wut > 0x10000) {
                         // wut still too large
-                        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "wakeup value too large"));
+                        mp_raise_ValueError("wakeup value too large");
                     }
                 }
             }
@@ -685,12 +685,10 @@ mp_obj_t pyb_rtc_calibration(mp_uint_t n_args, const mp_obj_t *args) {
                 }
                 return mp_obj_new_int(cal & 1);
             } else {
-                nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-                               "calibration value out of range"));
+                mp_raise_ValueError("calibration value out of range");
             }
 #else
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
-                "calibration value out of range"));
+            mp_raise_ValueError("calibration value out of range");
 #endif
         }
         if (cal > 0) {
diff --git a/stmhal/spi.c b/stmhal/spi.c
index 574fed07394e4a8dd2a8cc00d824323a1fe45400..d25e13f9868004335e3263ed3a0b825359cbfa79 100644
--- a/stmhal/spi.c
+++ b/stmhal/spi.c
@@ -765,7 +765,7 @@ STATIC mp_obj_t pyb_spi_send_recv(mp_uint_t n_args, const mp_obj_t *pos_args, mp
             // recv argument given
             mp_get_buffer_raise(args[1].u_obj, &bufinfo_recv, MP_BUFFER_WRITE);
             if (bufinfo_recv.len != bufinfo_send.len) {
-                nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "recv must be same length as send"));
+                mp_raise_ValueError("recv must be same length as send");
             }
             o_ret = args[1].u_obj;
         }
diff --git a/stmhal/timer.c b/stmhal/timer.c
index 570558775b7816e9b125c22e66470d1d0bbda4d6..938e9659714d03cc0fcce7392a045f6285758e66 100644
--- a/stmhal/timer.c
+++ b/stmhal/timer.c
@@ -278,7 +278,7 @@ STATIC uint32_t compute_prescaler_period_from_freq(pyb_timer_obj_t *self, mp_obj
         if (freq <= 0) {
             goto bad_freq;
             bad_freq:
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "must have positive freq"));
+            mp_raise_ValueError("must have positive freq");
         }
         period = source_freq / freq;
     }
@@ -429,7 +429,7 @@ STATIC void config_deadtime(pyb_timer_obj_t *self, mp_int_t ticks) {
 
 TIM_HandleTypeDef *pyb_timer_get_handle(mp_obj_t timer) {
     if (mp_obj_get_type(timer) != &pyb_timer_type) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "need a Timer object"));
+        mp_raise_ValueError("need a Timer object");
     }
     pyb_timer_obj_t *self = timer;
     return &self->tim;
@@ -541,7 +541,7 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, mp_uint_t n_args, c
         init->Prescaler = args[1].u_int;
         init->Period = args[2].u_int;
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "must specify either freq, or prescaler and period"));
+        mp_raise_TypeError("must specify either freq, or prescaler and period");
     }
 
     init->CounterMode = args[3].u_int;
@@ -891,7 +891,7 @@ STATIC mp_obj_t pyb_timer_channel(mp_uint_t n_args, const mp_obj_t *pos_args, mp
     mp_obj_t pin_obj = args[2].u_obj;
     if (pin_obj != mp_const_none) {
         if (!MP_OBJ_IS_TYPE(pin_obj, &pin_type)) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "pin argument needs to be be a Pin type"));
+            mp_raise_ValueError("pin argument needs to be be a Pin type");
         }
         const pin_obj_t *pin = pin_obj;
         const pin_af_obj_t *af = pin_find_af(pin, AF_FN_TIM, self->tim_id);
@@ -1174,7 +1174,7 @@ STATIC mp_obj_t pyb_timer_callback(mp_obj_t self_in, mp_obj_t callback) {
         HAL_TIM_Base_Start_IT(&self->tim); // This will re-enable the IRQ
         HAL_NVIC_EnableIRQ(self->irqn);
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "callback must be None or a callable object"));
+        mp_raise_ValueError("callback must be None or a callable object");
     }
     return mp_const_none;
 }
@@ -1331,7 +1331,7 @@ STATIC mp_obj_t pyb_timer_channel_callback(mp_obj_t self_in, mp_obj_t callback)
                 break;
         }
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "callback must be None or a callable object"));
+        mp_raise_ValueError("callback must be None or a callable object");
     }
     return mp_const_none;
 }
diff --git a/stmhal/usb.c b/stmhal/usb.c
index 9bf351f499e2e413b0832da1c42e91f5900bf7d2..e2cbd6745cf8925223e301b763e3b2c35bb3452f 100644
--- a/stmhal/usb.c
+++ b/stmhal/usb.c
@@ -319,7 +319,7 @@ STATIC mp_obj_t pyb_usb_mode(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
     return mp_const_none;
 
 bad_mode:
-    nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "bad USB mode"));
+    mp_raise_ValueError("bad USB mode");
 }
 MP_DEFINE_CONST_FUN_OBJ_KW(pyb_usb_mode_obj, 0, pyb_usb_mode);
 
@@ -590,7 +590,7 @@ STATIC mp_obj_t pyb_usb_hid_send(mp_obj_t self_in, mp_obj_t report_in) {
         mp_obj_t *items;
         mp_obj_get_array(report_in, &bufinfo.len, &items);
         if (bufinfo.len > sizeof(temp_buf)) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "tuple/list too large for HID report; use bytearray instead"));
+            mp_raise_ValueError("tuple/list too large for HID report; use bytearray instead");
         }
         for (int i = 0; i < bufinfo.len; i++) {
             temp_buf[i] = mp_obj_get_int(items[i]);
diff --git a/teensy/servo.c b/teensy/servo.c
index 6ccdb05e92938ce1e090577658512f9be830065e..262daaeb66fa616bfdd460fd67fc7380d7e0a504 100644
--- a/teensy/servo.c
+++ b/teensy/servo.c
@@ -217,7 +217,7 @@ mp_obj_t pyb_Servo(void) {
         self->servo_id++;
     }
     m_del_obj(pyb_servo_obj_t, self);
-    nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "No available servo ids"));
+    mp_raise_ValueError("No available servo ids");
     return mp_const_none;
 }
 
diff --git a/teensy/teensy_hal.c b/teensy/teensy_hal.c
index 4fcf9992257f5821c51f9744f014153cf0d94833..439e3380d9d0a26a7b7880b1d754f7f537952b16 100644
--- a/teensy/teensy_hal.c
+++ b/teensy/teensy_hal.c
@@ -61,5 +61,5 @@ void mp_hal_gpio_clock_enable(GPIO_TypeDef *gpio) {
 }
 
 void extint_register_pin(const void *pin, uint32_t mode, int hard_irq, mp_obj_t callback_obj) {
-    mp_not_implemented(NULL);
+    mp_raise_NotImplementedError(NULL);
 }
diff --git a/teensy/timer.c b/teensy/timer.c
index bc560d85e0ca369e62de14309d84548f7352f2dd..6e578acc14aa6490cb65fa4951686751accb90c6 100644
--- a/teensy/timer.c
+++ b/teensy/timer.c
@@ -255,7 +255,7 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, uint n_args, const
         // set prescaler and period from frequency
 
         if (vals[0].u_int == 0) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "can't have 0 frequency"));
+            mp_raise_ValueError("can't have 0 frequency");
         }
 
         uint32_t period = MAX(1, F_BUS / vals[0].u_int);
@@ -277,7 +277,7 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, uint n_args, const
             nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "period must be between 0 and 65535, not %d", init->Period));
         }
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "must specify either freq, or prescaler and period"));
+        mp_raise_TypeError("must specify either freq, or prescaler and period");
     }
 
     init->CounterMode = vals[3].u_int;
@@ -498,7 +498,7 @@ STATIC mp_obj_t pyb_timer_channel(mp_uint_t n_args, const mp_obj_t *args, mp_map
     mp_obj_t pin_obj = vals[1].u_obj;
     if (pin_obj != mp_const_none) {
         if (!MP_OBJ_IS_TYPE(pin_obj, &pin_type)) {
-            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "pin argument needs to be be a Pin type"));
+            mp_raise_ValueError("pin argument needs to be be a Pin type");
         }
         const pin_obj_t *pin = pin_obj;
         const pin_af_obj_t *af = pin_find_af(pin, AF_FN_FTM, self->tim_id);
@@ -668,7 +668,7 @@ STATIC mp_obj_t pyb_timer_callback(mp_obj_t self_in, mp_obj_t callback) {
         // start timer, so that it interrupts on overflow
         HAL_FTM_Base_Start_IT(&self->ftm);
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "callback must be None or a callable object"));
+        mp_raise_ValueError("callback must be None or a callable object");
     }
     return mp_const_none;
 }
@@ -846,7 +846,7 @@ STATIC mp_obj_t pyb_timer_channel_callback(mp_obj_t self_in, mp_obj_t callback)
                 break;
         }
     } else {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "callback must be None or a callable object"));
+        mp_raise_ValueError("callback must be None or a callable object");
     }
     return mp_const_none;
 }
diff --git a/unix/file.c b/unix/file.c
index f27e23547d38414fb506c73c0052b2e5f8f02d30..0d65f9ca0d4b60f06488f94bf89f16fe5cb0f17a 100644
--- a/unix/file.c
+++ b/unix/file.c
@@ -47,7 +47,7 @@
 #ifdef MICROPY_CPYTHON_COMPAT
 STATIC void check_fd_is_open(const mp_obj_fdfile_t *o) {
     if (o->fd < 0) {
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "I/O operation on closed file"));
+        mp_raise_ValueError("I/O operation on closed file");
     }
 }
 #else
diff --git a/unix/modffi.c b/unix/modffi.c
index 6c5e4f22ee7ad7436cd309ebaa3753ef5dab9eea..9b514371bc9d006d28fc0ed9a77dc8e271e2c93f 100644
--- a/unix/modffi.c
+++ b/unix/modffi.c
@@ -409,7 +409,7 @@ STATIC mp_obj_t ffifunc_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const
     }
 
 error:
-    nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "Don't know how to pass object to native function"));
+    mp_raise_TypeError("Don't know how to pass object to native function");
 }
 
 STATIC const mp_obj_type_t ffifunc_type = {
diff --git a/unix/modjni.c b/unix/modjni.c
index 540964d446fb82f221114f4e135d01a0fc9d836b..df9cd9d67a2dc59080566d94d5275a6218d97632 100644
--- a/unix/modjni.c
+++ b/unix/modjni.c
@@ -268,7 +268,7 @@ STATIC mp_obj_t jobject_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value)
                 return mp_const_none;
             }
         }
-        mp_not_implemented("");
+        mp_raise_NotImplementedError("");
     }
 
     if (!JJ(IsInstanceOf, self->obj, List_class)) {