diff --git a/diceware/__init__.py b/diceware/__init__.py
index 91b633eb3f81223a57b3e6634cf5cca3d971fba4..03b7534a25df298dfeaffd6a7dee5f63924f7180 100644
--- a/diceware/__init__.py
+++ b/diceware/__init__.py
@@ -18,6 +18,8 @@
 import argparse
 import pkg_resources
 import sys
+import logging
+from errno import ENOENT
 from random import SystemRandom
 from diceware.config import get_config_dict
 from diceware.logger import configure
@@ -208,4 +210,12 @@ def main(args=None):
     if options.version:
         print_version()
         raise SystemExit(0)
-    print(get_passphrase(options))
+    try:
+        print(get_passphrase(options))
+    except (OSError, IOError) as infile_error:
+        if getattr(infile_error, 'errno', 0) == ENOENT:
+            logging.getLogger('ulif.diceware').error(
+                "The file '%s' does not exist." % infile_error.filename)
+            raise SystemExit(1)
+        else:
+            raise
diff --git a/diceware/wordlist.py b/diceware/wordlist.py
index 32d80fdf69aafa84dd77902dd4023879de7cf319..96185d1865667dc8f97d3cd2fd190af0dfafffb7 100644
--- a/diceware/wordlist.py
+++ b/diceware/wordlist.py
@@ -111,6 +111,7 @@ class WordList(object):
     """
     def __init__(self, path):
         self.path = path
+        self.fd = None
         if self.path == "-":
             self.fd = tempfile.SpooledTemporaryFile(
                     max_size=MAX_IN_MEM_SIZE, mode="w+")
@@ -121,7 +122,7 @@ class WordList(object):
         self.signed = self.is_signed()
 
     def __del__(self):
-        if self.path != "-":
+        if self.path != "-" and self.fd is not None:
             self.fd.close()
 
     def __iter__(self):
diff --git a/tests/test_diceware.py b/tests/test_diceware.py
index d6255bb32bdbae0c6d19b92eb37fb636839c4cdf..956877860e5154483cf11c9a2fef1691a283fcab 100644
--- a/tests/test_diceware.py
+++ b/tests/test_diceware.py
@@ -5,6 +5,7 @@ import pytest
 import re
 import sys
 from io import StringIO
+from errno import EISDIR
 from diceware import (
     get_wordlists_dir, SPECIAL_CHARS, insert_special_char, get_passphrase,
     handle_options, main, __version__, print_version, get_random_sources,
@@ -317,6 +318,25 @@ class TestDicewareModule(object):
         out, err = capsys.readouterr()
         assert out == 'Word1Word1\n'
 
+    def test_main_infile_nonexisting(self, argv_handler, capsys):
+        # main() prints error if file does not exist
+        # raises the exception if it's other that file not exist
+        sys.argv = ['diceware', 'nonexisting']
+        with pytest.raises(SystemExit) as exc_info:
+            main()
+        assert exc_info.value.code == 1
+        out, err = capsys.readouterr()
+        assert "The file 'nonexisting' does not exist." in err
+
+    def test_main_infile_not_a_file(self, argv_handler, tmpdir):
+        # give directory as input
+        tmpdir.mkdir("wordlist")
+        tmpdir.chdir()
+        sys.argv = ['diceware', 'wordlist']
+        with pytest.raises(IOError) as infile_error:
+            main()
+        assert infile_error.value.errno == EISDIR
+
     def test_main_delimiters(self, argv_handler, capsys):
         # delimiters are respected on calls to main
         sys.stdin = StringIO("word1\n")