diff --git a/geocoder.admin.inc b/geocoder.admin.inc
index 36cda8d..1161362 100644
--- a/geocoder.admin.inc
+++ b/geocoder.admin.inc
@@ -110,6 +110,13 @@ function geocoder_admin_settings($form, &$form_state) {
     '#description' => t('Geocoder caches all queries by default. Do you want that to include the ones with no results? If not, it will be checked every time, probably with the same no-result.'),
   );
 
+  $form['geocoder_log_empty_results'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Log empty results'),
+    '#default_value' => variable_get('geocoder_log_empty_results', FALSE),
+    '#description' => t('Whether to generate a watchdog log when geocoding returns no results.'),
+  );
+
   $form['#submit'][] = 'geocoder_admin_settings_submit';
   return system_settings_form($form);
 }
diff --git a/geocoder.module b/geocoder.module
index a3ceba3..6f559ea 100644
--- a/geocoder.module
+++ b/geocoder.module
@@ -67,6 +67,10 @@ function geocoder($handler, $data, $options = array(), $cache_type = 'DEPRECATED
     geocoder_cache_set($geometry, $handler, $data, $options);
   }
 
+  if (!$geometry && variable_get('geocoder_log_empty_results', FALSE)) {
+    watchdog('geocoder', t('No results for geocoding @data', array('@data' => $data)));
+  }
+
   return $geometry;
 }
 
@@ -74,11 +78,11 @@ 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',
-    'description' => 'Configuration for API keys.',
+    'description' => 'Configuration for API keys and other global settings.',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('geocoder_admin_settings'),
     'file' => 'geocoder.admin.inc',
diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index 16c21af..06f9e32 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -334,28 +334,23 @@ 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;
-
-            $uri_info = entity_uri($entity_type, $entity);
-            list($id, , $bundle) = entity_extract_ids($entity_type, $entity);
-            $label = t('View offending @entity_type (@bundle # @id)', array(
-              '@entity_type' => $entity_type,
-              '@bundle' => $bundle,
-              '@id' => $id,
-            ));
-            watchdog_exception('geocoder', $e, NULL, array(), WATCHDOG_WARNING, l($label, $uri_info['path'], $uri_info));
+            watchdog_exception('geocoder', $e, NULL, array(), WATCHDOG_ERROR, geocoder_widget_get_link($entity_type, $entity));
+            continue;
           }
-
-          // Save result persistently.
-          geocoder_cache_set($geometry, $handler['name'], $item, $handler_settings);
         }
 
         if ($geometry instanceof Geometry) {
           $geometries[] = $geometry;
         }
+        elseif (variable_get('geocoder_log_empty_results', FALSE)) {
+          watchdog('geocoder', 'No results for geocoding', NULL, WATCHDOG_NOTICE, geocoder_widget_get_link($entity_type, $entity));
+        }
       }
 
       if (empty($geometries)) {
@@ -530,3 +525,17 @@ function geocoder_widget_parse_locationfield($field_item) {
 
   return $address;
 }
+
+/**
+ * Geocoder Widget utility function to build a link for an entity, ready for use in watchdog().
+ */
+function geocoder_widget_get_link($entity_type, $entity) {
+  $uri_info = entity_uri($entity_type, $entity);
+  list($id, , $bundle) = entity_extract_ids($entity_type, $entity);
+  $label = t('View offending @entity_type (@bundle # @id)', array(
+    '@entity_type' => $entity_type,
+    '@bundle' => $bundle,
+    '@id' => $id,
+  ));
+  return l($label, $uri_info['path'], $uri_info);
+}
\ No newline at end of file
diff --git a/plugins/geocoder_handler/bing.inc b/plugins/geocoder_handler/bing.inc
index b0db992..9f5ce64 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;
+  }
 
-    // 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 28b5610..e676783 100644
--- a/plugins/geocoder_handler/google.inc
+++ b/plugins/geocoder_handler/google.inc
@@ -23,179 +23,172 @@ $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')) {
 
-    $google_url = 'http://maps.googleapis.com/maps/api/geocode/json';
-    if (!empty($options['https'])) {
-      $google_url = str_replace('http://', 'https://', $google_url);
+    // 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;
+  }
 
-    // Build the URL.
-    $url = url($google_url, array(
-      'query' => $query,
-    ));
+  $google_url = 'http://maps.googleapis.com/maps/api/geocode/json';
+  if (!empty($options['https'])) {
+    $google_url = str_replace('http://', 'https://', $google_url);
+  }
 
-    // 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($google_url, 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;
-        }
+  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') {
-        if (isset($item->geometry->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') {
+    // 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') {
+      if (isset($item->geometry->bounds)) {
         $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),
+          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)));
       }
-
-      // 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;
+    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)));
     }
 
-    // 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);
+    // 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 there are any other geometries, these are auxiliary geometries that represent "alternatives"
-    if (count($geometries)) {
-      $geometry->data['geocoder_alternatives'] = $geometries;
+  if (empty($geometries)) {
+    return;
+  }
+
+  // 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..30187f0 100644
--- a/plugins/geocoder_handler/latlon.inc
+++ b/plugins/geocoder_handler/latlon.inc
@@ -2,7 +2,6 @@
 
 /**
  * @file
- * Plugin to provide a google geocoder.
  */
 
 /**
diff --git a/plugins/geocoder_handler/yahoo.inc b/plugins/geocoder_handler/yahoo.inc
index 490f360..9f4e886 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}");
diff --git a/plugins/geocoder_handler/yandex.inc b/plugins/geocoder_handler/yandex.inc
index e7ef435..ef3c16c 100644
--- a/plugins/geocoder_handler/yandex.inc
+++ b/plugins/geocoder_handler/yandex.inc
@@ -29,8 +29,7 @@ function geocoder_yandex($address, $options = array()) {
     $consumer_key = $geocoder_settings["geocoder_apikey_yandex"];
   }
   else {
-    drupal_set_message(t('You must set up your Yandex 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 Yandex API key. Click !config', array('!config' => l(t('here'), $base_path .'admin/config/content/geocoder'))));
   }
 
   $params = array (
@@ -64,25 +63,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 NULL;
   }
+
+  $loc = explode(' ', $data->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos);
+  return new Point ($loc[0], $loc[1]);
 }
\ No newline at end of file
