Throw clear exceptions
diff --git a/requests/models.py b/requests/models.py
index 136427fe7d..ae3c1be135 100644
--- a/requests/models.py
+++ b/requests/models.py
@@ -413,7 +413,10 @@ def full_url(self):
         if not scheme in SCHEMAS:
             raise InvalidSchema("Invalid scheme %r" % scheme)
 
-        netloc = netloc.encode('idna').decode('utf-8')
+        try:
+            netloc = netloc.encode('idna').decode('utf-8')
+        except UnicodeError:
+            raise InvalidURL('URL has an invalid label.')
 
         if not path:
             path = '/'
diff --git a/tests/test_requests.py b/tests/test_requests.py
index f43ccac85b..3bbcfdf48e 100755
--- a/tests/test_requests.py
+++ b/tests/test_requests.py
@@ -19,6 +19,7 @@
 from requests import HTTPError
 from requests import get, post, head, put
 from requests.auth import HTTPBasicAuth, HTTPDigestAuth
+from requests.exceptions import InvalidURL
 
 if 'HTTPBIN_URL' not in os.environ:
     os.environ['HTTPBIN_URL'] = 'http://httpbin.org/'
@@ -1062,6 +1063,10 @@ def test_bytes_files(self):
         """Test that `bytes` can be used as the values of `files`."""
         post(httpbin('post'), files={'test': b'test'})
 
+    def test_invalid_urls_throw_requests_exception(self):
+        """Test that URLs with invalid labels throw
+        Requests.exceptions.InvalidURL instead of UnicodeError."""
+        self.assertRaises(InvalidURL, get, 'http://.google.com/')
 
 if __name__ == '__main__':
     unittest.main()

I'm not super invested in this: I think the UnicodeError is reasonably clear, but it probably helps to throw a Requests based exception when there is an error in the URL. The InvalidURL exception subclasses ValueError, which means anyone catching this by looking for ValueErrors will still catch this exception.

That said, you might just want to keep throwing the Unicode Error.

(Inspired by me really wanting to close #697.)
