Trying to get property of non-object throws exception that cannot be handled
I actually over-simplified by question. The crash doesn't happen in the simple case I posted, just an error and execution continues. It arises when I use field API syntax to refer to a null referenced entity, and only then when the target_id is not null.

$node-&gt;field_foo-&gt;target_id = 999; // term 999 does not exist
try {
  // The next line results in an unhandled exception 
  $v = $node-&gt;field_foo-&gt;entity-&gt;field_bar-&gt;value;
} catch (\Exception $e) {
  // Never gets here
  watchdog_exception('example', $e);
}
// And never gets to continue here


The issue was why and Drupal does this. The solution (thanks @Clive) is to replace catch (\Exception $e) with catch (\Throwable $e)