diff --git a/geocoder.module b/geocoder.module
index a3ceba3..e622dd2 100644
--- a/geocoder.module
+++ b/geocoder.module
@@ -35,6 +35,7 @@ define('GEOCODER_GOOGLE_AUTH_WORK', 3);
  * @return Geometry
  *   Returns a geoPHP geometry object. Generally a Point.
  *   See http://drupal.org/project/geoPHP and https://github.com/phayes/geoPHP/wiki/API-Reference
+ *   FALSE indicates zero results.  NULL indicates geocode error.
  *
  * @example:
  *    geocoder('google','4925 Gair Ave, Terrace, BC');
@@ -59,7 +60,7 @@ function geocoder($handler, $data, $options = array(), $cache_type = 'DEPRECATED
       $geometry = call_user_func($processor['callback'], $data, $options);
     }
     catch (Exception $e) {
-      watchdog_exception('geocoder', $e);
+      watchdog_exception('geocoder', $e, NULL, array(), WATCHDOG_WARNING);
       return NULL;
     }
 
@@ -74,7 +75,7 @@ function geocoder($handler, $data, $options = array(), $cache_type = 'DEPRECATED
 /**
  * Implements hook_menu().
  */
-function  geocoder_menu() {
+function geocoder_menu() {
   // Admin settings for the site.
   $items['admin/config/content/geocoder'] = array(
     'title' => 'Geocoder settings',
diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index 16c21af..63a128e 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -334,8 +334,11 @@ function geocoder_widget_get_field_value($entity_type, $field_instance, $entity
           // Geocode any value from our source field.
           try {
             $geometry = call_user_func($handler['field_callback'], $field_info, $item, $handler_settings);
+
+            // Save result persistently.
+            geocoder_cache_set($geometry, $handler['name'], $item, $handler_settings);
           }
-          // No-results or errors throw exceptions, which affects 1 field item, not all.
+          // Exception affects just this one field item.
           catch (Exception $e) {
             $geometry = FALSE;
 
@@ -348,9 +351,6 @@ function geocoder_widget_get_field_value($entity_type, $field_instance, $entity
             ));
             watchdog_exception('geocoder', $e, NULL, array(), WATCHDOG_WARNING, l($label, $uri_info['path'], $uri_info));
           }
-
-          // Save result persistently.
-          geocoder_cache_set($geometry, $handler['name'], $item, $handler_settings);
         }
 
         if ($geometry instanceof Geometry) {
diff --git a/plugins/geocoder_handler/bing.inc b/plugins/geocoder_handler/bing.inc
index b0db992..1f935ab 100644
--- a/plugins/geocoder_handler/bing.inc
+++ b/plugins/geocoder_handler/bing.inc
@@ -22,100 +22,95 @@ $plugin = array(
  * Geocode an address.
  */
 function geocoder_bing($address, $options = array()) {
-  try {
-    geophp_load();
-    $geocoder_settings = variable_get('geocoder_settings', array());
+  geophp_load();
+  $geocoder_settings = variable_get('geocoder_settings', array());
 
-    if (!empty($geocoder_settings['geocoder_apikey_bing'])) {
-      $consumer_key = $geocoder_settings['geocoder_apikey_bing'];
-    }
-    else {
-      throw new Exception('You must specify a key.');
-    }
-
-    if (isset($options['address']) && is_array($options['address'])) {
-      $query = array(
-        'countryRegion' => (isset($options['address']['country']) ? $options['address']['country'] : ''),
-        'adminDistrict' => (isset($options['address']['administrative_area']) ? $options['address']['administrative_area'] : ''),
-        'locality' => (isset($options['address']['locality']) ? $options['address']['locality'] : ''),
-        'postalCode' => (isset($options['address']['postal_code']) ? $options['address']['postal_code'] : ''),
-        'addressLine' => (isset($options['address']['thoroughfare']) ? $options['address']['thoroughfare'] : ''),
-        'userIp' => '127.0.0.1',
-        'includeNeighborhood' => 0,
-        'maxResults' => 1,
-        'key' => $consumer_key,
-      );
-    }
-    else {
-      $query = array(
-        'q' => $address,
-        'key' => $consumer_key,
-      );
-    }
+  if (!empty($geocoder_settings['geocoder_apikey_bing'])) {
+    $consumer_key = $geocoder_settings['geocoder_apikey_bing'];
+  }
+  else {
+    throw new Exception('You must specify a key.');
+  }
 
-    // Extra options
-    if (!empty($options['userLocation'])) {
-      $query['userLocation'] = $options['userLocation'];
-    }
-    if (!empty($options['userIp'])) {
-      $query['userIp'] = $options['userIp'];
-    }
-    if (!empty($options['includeNeighborhood'])) {
-      $query['includeNeighborhood'] = $options['includeNeighborhood'];
-    }
-    if (!empty($options['maxResults'])) {
-      $query['maxResults'] = $options['maxResults'];
-    }
+  if (isset($options['address']) && is_array($options['address'])) {
+    $query = array(
+      'countryRegion' => (isset($options['address']['country']) ? $options['address']['country'] : ''),
+      'adminDistrict' => (isset($options['address']['administrative_area']) ? $options['address']['administrative_area'] : ''),
+      'locality' => (isset($options['address']['locality']) ? $options['address']['locality'] : ''),
+      'postalCode' => (isset($options['address']['postal_code']) ? $options['address']['postal_code'] : ''),
+      'addressLine' => (isset($options['address']['thoroughfare']) ? $options['address']['thoroughfare'] : ''),
+      'userIp' => '127.0.0.1',
+      'includeNeighborhood' => 0,
+      'maxResults' => 1,
+      'key' => $consumer_key,
+    );
+  }
+  else {
+    $query = array(
+      'q' => $address,
+      'key' => $consumer_key,
+    );
+  }
 
-    $url = url('http://dev.virtualearth.net/REST/v1/Locations', array('query' => $query));
-    $result = drupal_http_request($url);
+  // Extra options
+  if (!empty($options['userLocation'])) {
+    $query['userLocation'] = $options['userLocation'];
+  }
+  if (!empty($options['userIp'])) {
+    $query['userIp'] = $options['userIp'];
+  }
+  if (!empty($options['includeNeighborhood'])) {
+    $query['includeNeighborhood'] = $options['includeNeighborhood'];
+  }
+  if (!empty($options['maxResults'])) {
+    $query['maxResults'] = $options['maxResults'];
+  }
 
-    if (isset($result->error)) {
-      $args = array(
-        '@code' => $result->code,
-        '@error' => $result->error,
-      );
-      $msg = t('HTTP request to Bing API failed.\nCode: @code\nError: @error', $args);
-      throw new Exception($msg);
-    }
+  $url = url('http://dev.virtualearth.net/REST/v1/Locations', array('query' => $query));
+  $result = drupal_http_request($url);
 
-    $data = json_decode($result->data);
+  if (isset($result->error)) {
+    $args = array(
+      '@code' => $result->code,
+      '@error' => $result->error,
+    );
+    $msg = t('HTTP request to Bing API failed.\nCode: @code\nError: @error', $args);
+    throw new Exception($msg);
+  }
 
-    if ($data->statusCode != 200) {
-      $msg = t('Bing API returned bad status.\nStatus: @status\n@description', array(
-        '@status' => $data->statusCode,
-        '@description' => $data->statusDescription,
-      ));
-      throw new Exception($msg);
-    }
+  $data = json_decode($result->data);
 
-    $geometries = array();
+  if ($data->statusCode != 200) {
+    $msg = t('Bing API returned bad status.\nStatus: @status\n@description', array(
+      '@status' => $data->statusCode,
+      '@description' => $data->statusDescription,
+    ));
+    throw new Exception($msg);
+  }
 
-    foreach ($data->resourceSets as $resourceSet) {
-      foreach ($resourceSet->resources as $resource) {
-        $geom = new Point($resource->point->coordinates[1], $resource->point->coordinates[0]);
-        $geom->data = $resource;
-        $geometries[] = $geom;
-      }
-    }
+  $geometries = array();
 
-    if (empty($geometries)) {
-      return;
+  foreach ($data->resourceSets as $resourceSet) {
+    foreach ($resourceSet->resources as $resource) {
+      $geom = new Point($resource->point->coordinates[1], $resource->point->coordinates[0]);
+      $geom->data = $resource;
+      $geometries[] = $geom;
     }
+  }
 
-    // The canonical geometry is the first result (best guess)
-    $geometry = array_shift($geometries);
+  if (empty($geometries)) {
+    return FALSE;
+  }
 
-    // If there are any other geometries, these are auxiliary geometries that represent "alternatives"
-    if (count($geometries)) {
-      $geometry->data->geocoder_alternatives = $geometries;
-    }
+  // The canonical geometry is the first result (best guess)
+  $geometry = array_shift($geometries);
 
-    return $geometry;
-  } catch (Exception $e) {
-    watchdog_exception('geocoder', $e);
-    return FALSE;
+  // If there are any other geometries, these are auxiliary geometries that represent "alternatives"
+  if (count($geometries)) {
+    $geometry->data->geocoder_alternatives = $geometries;
   }
+
+  return $geometry;
 }
 
 function geocoder_bing_field($field, $field_item) {
diff --git a/plugins/geocoder_handler/exif.inc b/plugins/geocoder_handler/exif.inc
index d5f41af..b417d62 100644
--- a/plugins/geocoder_handler/exif.inc
+++ b/plugins/geocoder_handler/exif.inc
@@ -15,8 +15,7 @@ function geocoder_exif($uri, $options = array()) {
     $function = $module . '_file_download';
     $result = $function($uri);
     if ($result == -1) {
-      drupal_set_message(t('You do not have permission to access this file'), 'error');
-      return FALSE;
+      throw new Exception(t('You do not have permission to access this file'));
     }
   }
 
diff --git a/plugins/geocoder_handler/google.inc b/plugins/geocoder_handler/google.inc
index 5c4992f..b572c1c 100644
--- a/plugins/geocoder_handler/google.inc
+++ b/plugins/geocoder_handler/google.inc
@@ -23,172 +23,165 @@ $plugin = array(
  * Process Markup
  */
 function geocoder_google($address, $options = array()) {
-  try {
-    $delay_trigger = &drupal_static(__FUNCTION__);
-    $delay = variable_get('geocoder_google_delay', 0);
-    if ($delay > 0 && $delay_trigger) {
-      usleep($delay * 1000);
-    }
+  $delay_trigger = &drupal_static(__FUNCTION__);
+  $delay = variable_get('geocoder_google_delay', 0);
+  if ($delay > 0 && $delay_trigger) {
+    usleep($delay * 1000);
+  }
 
-    geophp_load();
+  geophp_load();
 
-    $query = array('address' => $address);
+  $query = array('address' => $address);
 
-    if (isset($options['extra_query']) && is_array($options['extra_query'])) {
-      $query += $options['extra_query'];
-    }
+  if (isset($options['extra_query']) && is_array($options['extra_query'])) {
+    $query += $options['extra_query'];
+  }
 
-    // Add any given biasing.
-    if (!empty($options['biasing']['bounds'])) {
-      $query['bounds'] = $options['biasing']['bounds'];
-    }
-    if (!empty($options['biasing']['region'])) {
-      $query['region'] = $options['biasing']['region'];
-    }
-    if (!empty($options['biasing']['components'])) {
-      $query['components'] = $options['biasing']['components'];
-    }
+  // Add any given biasing.
+  if (!empty($options['biasing']['bounds'])) {
+    $query['bounds'] = $options['biasing']['bounds'];
+  }
+  if (!empty($options['biasing']['region'])) {
+    $query['region'] = $options['biasing']['region'];
+  }
+  if (!empty($options['biasing']['components'])) {
+    $query['components'] = $options['biasing']['components'];
+  }
 
-    // Add Google API authentication parameters.
-    switch (variable_get('geocoder_google_auth_method')) {
-
-      // Google Geocoding API Key.
-      case GEOCODER_GOOGLE_AUTH_KEY:
-        $geocoder_settings = variable_get("geocoder_settings", array());
-        if (!empty($geocoder_settings['geocoder_apikey_google'])) {
-          $query['key'] = $geocoder_settings['geocoder_apikey_google'];
-        }
-        break;
-
-      // Google Maps for Work signature.
-      case GEOCODER_GOOGLE_AUTH_WORK:
-        $client_id   = variable_get('geocoder_google_client_id', FALSE);
-        $private_key = variable_get('geocoder_google_private_key', FALSE);
-        if (!empty($client_id) && !empty($private_key)) {
-          $google_maps_for_work = TRUE;
-          $query['client']      = $client_id;
-        }
-        break;
-    }
+  // Add Google API authentication parameters.
+  switch (variable_get('geocoder_google_auth_method')) {
 
-    // Build the URL.
-    $url = url("https://maps.googleapis.com/maps/api/geocode/json", array(
-      'query' => $query,
-    ));
+    // Google Geocoding API Key.
+  case GEOCODER_GOOGLE_AUTH_KEY:
+    $geocoder_settings = variable_get("geocoder_settings", array());
+    if (!empty($geocoder_settings['geocoder_apikey_google'])) {
+      $query['key'] = $geocoder_settings['geocoder_apikey_google'];
+    }
+    break;
+
+    // Google Maps for Work signature.
+  case GEOCODER_GOOGLE_AUTH_WORK:
+    $client_id   = variable_get('geocoder_google_client_id', FALSE);
+    $private_key = variable_get('geocoder_google_private_key', FALSE);
+    if (!empty($client_id) && !empty($private_key)) {
+      $google_maps_for_work = TRUE;
+      $query['client']      = $client_id;
+    }
+    break;
+  }
 
-    // If authenticating via Google Maps for Work, add signature.
-    // @see https://developers.google.com/maps/documentation/business/webservices/auth#generating_valid_signatures
-    if (!empty($google_maps_for_work)) {
+  // Build the URL.
+  $url = url("https://maps.googleapis.com/maps/api/geocode/json", array(
+    'query' => $query,
+  ));
 
-      // Strip off the protocol and host for signing.
-      $parsed      = parse_url($url);
-      $url_to_sign = $parsed['path'] . '?' . $parsed['query'];
+  // If authenticating via Google Maps for Work, add signature.
+  // @see https://developers.google.com/maps/documentation/business/webservices/auth#generating_valid_signatures
+  if (!empty($google_maps_for_work)) {
 
-      // Decode the key in a URL-safe way (RFC 4648 Section 5).
-      // @see https://www.ietf.org/rfc/rfc4648.txt
-      $decoded_key = base64_decode(strtr($private_key, '-_', '+/'));
+    // Strip off the protocol and host for signing.
+    $parsed      = parse_url($url);
+    $url_to_sign = $parsed['path'] . '?' . $parsed['query'];
 
-      // Use HMAC SHA1 to sign the URL with the decoded key.
-      $signature = hash_hmac('sha1', $url_to_sign, $decoded_key, TRUE);
+    // Decode the key in a URL-safe way (RFC 4648 Section 5).
+    // @see https://www.ietf.org/rfc/rfc4648.txt
+    $decoded_key = base64_decode(strtr($private_key, '-_', '+/'));
 
-      // Append the signature to the URL's query parameters. Do this manually to
-      // avoid URL encoding.
-      $url .= '&signature=' . strtr(base64_encode($signature), '+/', '-_');
-    }
+    // Use HMAC SHA1 to sign the URL with the decoded key.
+    $signature = hash_hmac('sha1', $url_to_sign, $decoded_key, TRUE);
 
-    // Send the request.
-    $result = drupal_http_request($url);
-    $delay_trigger = TRUE;
+    // Append the signature to the URL's query parameters. Do this manually to
+    // avoid URL encoding.
+    $url .= '&signature=' . strtr(base64_encode($signature), '+/', '-_');
+  }
 
-    if (isset($result->error)) {
-      $args = array(
-        '@code' => $result->code,
-        '@error' => $result->error,
-      );
-      $msg = t('HTTP request to google API failed.\nCode: @code\nError: @error', $args);
-      throw new Exception($msg, WATCHDOG_ERROR);
-    }
+  // Send the request.
+  $result = drupal_http_request($url);
+  $delay_trigger = TRUE;
+
+  if (isset($result->error)) {
+    $args = array(
+      '@code' => $result->code,
+      '@error' => $result->error,
+    );
+    $msg = t('HTTP request to google API failed.\nCode: @code\nError: @error', $args);
+    throw new Exception($msg);
+  }
 
-    $data = json_decode($result->data);
+  $data = json_decode($result->data);
 
-    if ($data->status == 'ZERO_RESULTS') {
-      $args = array('@status' => $data->status, '@address' => $address);
-      $msg = t('Google API returned zero results on @address status.\nStatus: @status', $args);
-      throw new Exception($msg, WATCHDOG_NOTICE);
-    }
-    elseif ($data->status != 'OK') {
-      $args = array('@status' => $data->status);
-      $msg = t('Google API returned bad status.\nStatus: @status', $args);
-      throw new Exception($msg, WATCHDOG_WARNING);
-    }
+  if ($data->status == 'ZERO_RESULTS') {
+    return FALSE;
+  }
+  elseif ($data->status != 'OK') {
+    $args = array('@status' => $data->status);
+    $msg = t('Google API returned bad status.\nStatus: @status', $args);
+    throw new Exception($msg);
+  }
 
-    $geometries = array();
+  $geometries = array();
 
-    foreach ($data->results as $item) {
-      // Check if we should reject these results
-      if (isset($options['reject_results'])) {
-        if (in_array($item->geometry->location_type, $options['reject_results'], TRUE)) {
-          continue;
-        }
-      }
-
-      // Construct a geoPHP Geometry depending on what type of geometry we want returned (defaults to point)
-      if (!isset($options['geometry_type']) || $options['geometry_type'] == 'point') {
-        $geom = new Point($item->geometry->location->lng, $item->geometry->location->lat);
-      }
-      elseif ($options['geometry_type'] == 'bounds') {
-        $points = array(
-          new Point($item->geometry->bounds->southwest->lng, $item->geometry->bounds->southwest->lat),
-          new Point($item->geometry->bounds->southwest->lng, $item->geometry->bounds->northeast->lat),
-          new Point($item->geometry->bounds->northeast->lng, $item->geometry->bounds->northeast->lat),
-          new Point($item->geometry->bounds->northeast->lng, $item->geometry->bounds->southwest->lat),
-          new Point($item->geometry->bounds->southwest->lng, $item->geometry->bounds->southwest->lat),
-        );
-        $geom = new Polygon(array(new LineString($points)));
+  foreach ($data->results as $item) {
+    // Check if we should reject these results
+    if (isset($options['reject_results'])) {
+      if (in_array($item->geometry->location_type, $options['reject_results'], TRUE)) {
+        continue;
       }
-      elseif ($options['geometry_type'] == 'viewport') {
-        $points = array(
-          new Point($item->geometry->viewport->southwest->lng, $item->geometry->viewport->southwest->lat),
-          new Point($item->geometry->viewport->southwest->lng, $item->geometry->viewport->northeast->lat),
-          new Point($item->geometry->viewport->northeast->lng, $item->geometry->viewport->northeast->lat),
-          new Point($item->geometry->viewport->northeast->lng, $item->geometry->viewport->southwest->lat),
-          new Point($item->geometry->viewport->southwest->lng, $item->geometry->viewport->southwest->lat),
-        );
-        $geom = new Polygon(array(new LineString($points)));
-      }
-
-      // Add additional metadata to the geometry - it might be useful!
-      $geom->data = array();
-      $geom->data['geocoder_accuracy'] = $item->geometry->location_type;
-      $geom->data['geocoder_formatted_address'] = $item->formatted_address;
-      $geom->data['geocoder_address_components'] = $item->address_components;
-
-      $geometries[] = $geom;
     }
 
-    if (empty($geometries)) {
-      return;
+    // Construct a geoPHP Geometry depending on what type of geometry we want returned (defaults to point)
+    if (!isset($options['geometry_type']) || $options['geometry_type'] == 'point') {
+      $geom = new Point($item->geometry->location->lng, $item->geometry->location->lat);
     }
-
-    // Check if we should return all results as a compound geometry
-    if (isset($options['all_results'])) {
-      if ($options['all_results']) {
-        return geoPHP::geometryReduce($geometries);
-      }
+    elseif ($options['geometry_type'] == 'bounds') {
+      $points = array(
+        new Point($item->geometry->bounds->southwest->lng, $item->geometry->bounds->southwest->lat),
+        new Point($item->geometry->bounds->southwest->lng, $item->geometry->bounds->northeast->lat),
+        new Point($item->geometry->bounds->northeast->lng, $item->geometry->bounds->northeast->lat),
+        new Point($item->geometry->bounds->northeast->lng, $item->geometry->bounds->southwest->lat),
+        new Point($item->geometry->bounds->southwest->lng, $item->geometry->bounds->southwest->lat),
+      );
+      $geom = new Polygon(array(new LineString($points)));
+    }
+    elseif ($options['geometry_type'] == 'viewport') {
+      $points = array(
+        new Point($item->geometry->viewport->southwest->lng, $item->geometry->viewport->southwest->lat),
+        new Point($item->geometry->viewport->southwest->lng, $item->geometry->viewport->northeast->lat),
+        new Point($item->geometry->viewport->northeast->lng, $item->geometry->viewport->northeast->lat),
+        new Point($item->geometry->viewport->northeast->lng, $item->geometry->viewport->southwest->lat),
+        new Point($item->geometry->viewport->southwest->lng, $item->geometry->viewport->southwest->lat),
+      );
+      $geom = new Polygon(array(new LineString($points)));
     }
-    // The canonical geometry is the first result (best guess)
-    $geometry = array_shift($geometries);
 
-    // If there are any other geometries, these are auxiliary geometries that represent "alternatives"
-    if (count($geometries)) {
-      $geometry->data['geocoder_alternatives'] = $geometries;
+    // Add additional metadata to the geometry - it might be useful!
+    $geom->data = array();
+    $geom->data['geocoder_accuracy'] = $item->geometry->location_type;
+    $geom->data['geocoder_formatted_address'] = $item->formatted_address;
+    $geom->data['geocoder_address_components'] = $item->address_components;
+
+    $geometries[] = $geom;
+  }
+
+  if (empty($geometries)) {
+    return FALSE;
+  }
+
+  // Check if we should return all results as a compound geometry
+  if (isset($options['all_results'])) {
+    if ($options['all_results']) {
+      return geoPHP::geometryReduce($geometries);
     }
+  }
+  // The canonical geometry is the first result (best guess)
+  $geometry = array_shift($geometries);
 
-    return $geometry;
-  } catch (Exception $e) {
-    // Just rethrow the exception, the geocoder widget handles it.
-    throw $e;
+  // If there are any other geometries, these are auxiliary geometries that represent "alternatives"
+  if (count($geometries)) {
+    $geometry->data['geocoder_alternatives'] = $geometries;
   }
+
+  return $geometry;
 }
 
 function geocoder_google_field($field, $field_item, $options = array()) {
diff --git a/plugins/geocoder_handler/latlon.inc b/plugins/geocoder_handler/latlon.inc
index f784c05..b0e4b8b 100644
--- a/plugins/geocoder_handler/latlon.inc
+++ b/plugins/geocoder_handler/latlon.inc
@@ -2,7 +2,6 @@
 
 /**
  * @file
- * Plugin to provide a google geocoder.
  */
 
 /**
@@ -35,7 +34,7 @@ function geocoder_latlon($latlon_string, $options = array()) {
   }
 
   // Failed to parse
-  return FALSE;
+  throw new Exception(t('Failed to parse string'));
 }
 
 function geocoder_latlon_DMStoDEC($dms) {
diff --git a/plugins/geocoder_handler/mapquest_nominatim.inc b/plugins/geocoder_handler/mapquest_nominatim.inc
index 41e33b3..644fba4 100644
--- a/plugins/geocoder_handler/mapquest_nominatim.inc
+++ b/plugins/geocoder_handler/mapquest_nominatim.inc
@@ -55,7 +55,7 @@ function geocoder_mapquest_nominatim_field($field, $field_item) {
 
 function _geocoder_mapquest_nominatim_geometry(&$data) {
   if (!isset($data[0]->lon)) {
-    return NULL;
+    return FALSE;
   }
   geophp_load();
   return new Point($data[0]->lon, $data[0]->lat);
diff --git a/plugins/geocoder_handler/openstreetmap_nominatim.inc b/plugins/geocoder_handler/openstreetmap_nominatim.inc
index a7989bc..c394e68 100644
--- a/plugins/geocoder_handler/openstreetmap_nominatim.inc
+++ b/plugins/geocoder_handler/openstreetmap_nominatim.inc
@@ -57,7 +57,7 @@ function geocoder_openstreetmap_nominatim_field($field, $field_item) {
 
 function _geocoder_openstreetmap_nominatim_geometry(&$data) {
   if (!isset($data[0]->lon)) {
-    return NULL;
+    return FALSE;
   }
   geophp_load();
   return new Point($data[0]->lon, $data[0]->lat);
diff --git a/plugins/geocoder_handler/yahoo.inc b/plugins/geocoder_handler/yahoo.inc
index 490f360..1687412 100644
--- a/plugins/geocoder_handler/yahoo.inc
+++ b/plugins/geocoder_handler/yahoo.inc
@@ -29,8 +29,7 @@ function geocoder_yahoo($address, $options = array()) {
     $consumer_key = $geocoder_settings["geocoder_apikey_yahoo"];
   }
   else {
-    drupal_set_message(t('You must set up your Yahoo API key. Click !config', array('!config' => l(t('here'), $base_path .'admin/config/content/geocoder'))),'error');
-    return;
+    throw new Exception(t('You must set up your Yahoo API key. Click !config', array('!config' => l(t('here'), $base_path .'admin/config/content/geocoder'))));
   }
 
   $request = drupal_http_request("http://where.yahooapis.com/geocode?location=" . urlencode($address) . "&flags=J&appid={$consumer_key}");
@@ -60,7 +59,7 @@ function geocoder_yahoo_field($field, $field_item) {
 
 function _geocoder_yahoo_geometry(&$data) {
   if (!isset($data->ResultSet)) {
-    return NULL;
+    return FALSE;
   }
   // Yahoo Placefinder API v2.
   elseif (isset($data->ResultSet->Result->longitude)) {
diff --git a/plugins/geocoder_handler/yandex.inc b/plugins/geocoder_handler/yandex.inc
index e7ef435..328b28f 100644
--- a/plugins/geocoder_handler/yandex.inc
+++ b/plugins/geocoder_handler/yandex.inc
@@ -64,25 +64,21 @@ function geocoder_yandex_field($field, $field_item) {
 }
 
 function _geocoder_yandex_geometry(&$data) {
-  try {
-    geophp_load();
+  geophp_load();
 
-    if (isset($data->error)) {
-      $args = array(
-        '@status' => $data->error->status,
-        '@error' => $data->error->message,
-      );
-      $msg = t('Yandex API has reported an error.\nStatus: @status\nError: @error', $args);
-      throw new Exception($msg, WATCHDOG_WARNING);
-    }
-
-    if($data->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found == 0) {
-      return NULL;
-    }
+  if (isset($data->error)) {
+    $args = array(
+      '@status' => $data->error->status,
+      '@error' => $data->error->message,
+    );
+    $msg = t('Yandex API has reported an error.\nStatus: @status\nError: @error', $args);
+    throw new Exception($msg);
+  }
 
-    $loc = explode(' ', $data->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos);
-    return new Point ($loc[0], $loc[1]);
-  } catch (Exception $e) {
-    watchdog_exception('geocoder', $e, $e->getMessage(), array(), $e->getCode());
+  if ($data->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found == 0) {
+    return FALSE;
   }
+
+  $loc = explode(' ', $data->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos);
+  return new Point ($loc[0], $loc[1]);
 }
\ No newline at end of file
