From 9389835d5a4524d0a472c70bb1fa4f4916997781 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Fri, 30 Nov 2018 22:34:15 +0100 Subject: [PATCH] Better error message in case of a non GRIB file. Closes #34 for real. --- cfgrib/messages.py | 4 ++++ tests/test_20_messages.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/cfgrib/messages.py b/cfgrib/messages.py index b065c782..d65316b4 100644 --- a/cfgrib/messages.py +++ b/cfgrib/messages.py @@ -207,10 +207,14 @@ class FileStream(collections.Iterable): def __iter__(self): # type: () -> T.Generator[Message, None, None] with open(self.path, 'rb') as file: + valid_grib_message_found = False while True: try: yield self.message_from_file(file, errors=self.errors) + valid_grib_message_found = True except EOFError: + if not valid_grib_message_found: + raise EOFError("No valid GRIB message found in file: %r" % self.path) break except Exception: if self.errors == 'ignore': diff --git a/tests/test_20_messages.py b/tests/test_20_messages.py index ec8b20d5..56e41a80 100644 --- a/tests/test_20_messages.py +++ b/tests/test_20_messages.py @@ -207,3 +207,8 @@ def test_FileStream(): assert len(leader) > 100 assert sum(1 for _ in res) == leader['count'] assert len(res.index(['paramId'])) == 1 + + # __file__ is not a GRIB, but contains the "GRIB" string, so it is a very tricky corner case + res = messages.FileStream(str(__file__)) + with pytest.raises(EOFError): + res.first()