Use the logException function in all places where exception messages are written to the error log

This commit is contained in:
Veronica K. B. Olsen
2021-01-29 18:29:50 +01:00
parent a2f223a992
commit 89ba4aeeaf
11 changed files with 72 additions and 63 deletions
+2 -2
View File
@@ -268,9 +268,9 @@ def main(sysArgs=None):
bundle = NSBundle.mainBundle() bundle = NSBundle.mainBundle()
info = bundle.localizedInfoDictionary() or bundle.infoDictionary() info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
info["CFBundleName"] = "novelWriter" info["CFBundleName"] = "novelWriter"
except ImportError as e: except ImportError:
logger.error("Failed to set application name") logger.error("Failed to set application name")
logException(e) logException()
# Import GUI (after dependency checks), and launch # Import GUI (after dependency checks), and launch
from nw.guimain import GuiMain from nw.guimain import GuiMain
+7 -6
View File
@@ -38,6 +38,7 @@ from PyQt5.QtCore import QT_VERSION_STR, QStandardPaths, QSysInfo
from nw.constants import nwConst, nwFiles, nwUnicode from nw.constants import nwConst, nwFiles, nwUnicode
from nw.common import splitVersionNumber, formatTimeStamp from nw.common import splitVersionNumber, formatTimeStamp
from nw.error import logException
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -293,7 +294,7 @@ class Config:
os.mkdir(self.confPath) os.mkdir(self.confPath)
except Exception as e: except Exception as e:
logger.error("Could not create folder: %s" % self.confPath) logger.error("Could not create folder: %s" % self.confPath)
logger.error(str(e)) logException()
self.hasError = True self.hasError = True
self.errData.append("Could not create folder: %s" % self.confPath) self.errData.append("Could not create folder: %s" % self.confPath)
self.errData.append(str(e)) self.errData.append(str(e))
@@ -316,7 +317,7 @@ class Config:
os.mkdir(self.dataPath) os.mkdir(self.dataPath)
except Exception as e: except Exception as e:
logger.error("Could not create folder: %s" % self.dataPath) logger.error("Could not create folder: %s" % self.dataPath)
logger.error(str(e)) logException()
self.hasError = True self.hasError = True
self.errData.append("Could not create folder: %s" % self.dataPath) self.errData.append("Could not create folder: %s" % self.dataPath)
self.errData.append(str(e)) self.errData.append(str(e))
@@ -361,7 +362,7 @@ class Config:
cnfParse.read_file(inFile) cnfParse.read_file(inFile)
except Exception as e: except Exception as e:
logger.error("Could not load config file") logger.error("Could not load config file")
logger.error(str(e)) logException()
self.hasError = True self.hasError = True
self.errData.append("Could not load config file") self.errData.append("Could not load config file")
self.errData.append(str(e)) self.errData.append(str(e))
@@ -702,7 +703,7 @@ class Config:
self.confChanged = False self.confChanged = False
except Exception as e: except Exception as e:
logger.error("Could not save config file") logger.error("Could not save config file")
logger.error(str(e)) logException()
self.hasError = True self.hasError = True
self.errData.append("Could not save config file") self.errData.append("Could not save config file")
self.errData.append(str(e)) self.errData.append(str(e))
@@ -978,9 +979,9 @@ class Config:
return self._unpackList( return self._unpackList(
cnfParse.get(cnfSec, cnfName), cnfDefault, self.CNF_S_LST cnfParse.get(cnfSec, cnfName), cnfDefault, self.CNF_S_LST
) )
except ValueError as e: except ValueError:
logger.error("Failed to load value from config file.") logger.error("Failed to load value from config file.")
logger.error(str(e)) logException()
return cnfDefault return cnfDefault
return cnfDefault return cnfDefault
+6 -6
View File
@@ -154,9 +154,9 @@ class NWIndex():
try: try:
with open(indexFile, mode="r", encoding="utf8") as inFile: with open(indexFile, mode="r", encoding="utf8") as inFile:
theData = json.load(inFile) theData = json.load(inFile)
except Exception as e: except Exception:
logger.error("Failed to load index file") logger.error("Failed to load index file")
logger.error(str(e)) nw.logException()
self.indexBroken = True self.indexBroken = True
self.theParent.makeAlert( self.theParent.makeAlert(
"Could not load cached index file. Rebuilding index.", "Could not load cached index file. Rebuilding index.",
@@ -195,9 +195,9 @@ class NWIndex():
"noteIndex" : self._noteIndex, "noteIndex" : self._noteIndex,
"textCounts" : self._textCounts, "textCounts" : self._textCounts,
}, outFile, indent=2) }, outFile, indent=2)
except Exception as e: except Exception:
logger.error("Failed to save index file") logger.error("Failed to save index file")
logger.error(str(e)) nw.logException()
return False return False
return True return True
@@ -217,9 +217,9 @@ class NWIndex():
self._checkTextCounts() self._checkTextCounts()
self.indexBroken = False self.indexBroken = False
except Exception as e: except Exception:
logger.error("Error while checking index") logger.error("Error while checking index")
nw.logException(e) nw.logException()
self.indexBroken = True self.indexBroken = True
tEnd = time() tEnd = time()
+5 -4
View File
@@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import nw
import logging import logging
import json import json
import os import os
@@ -121,9 +122,9 @@ class OptionState():
try: try:
with open(stateFile, mode="r", encoding="utf8") as inFile: with open(stateFile, mode="r", encoding="utf8") as inFile:
theState = json.load(inFile) theState = json.load(inFile)
except Exception as e: except Exception:
logger.error("Failed to load GUI options file") logger.error("Failed to load GUI options file")
logger.error(str(e)) nw.logException()
return False return False
# Filter out unused variables # Filter out unused variables
@@ -148,9 +149,9 @@ class OptionState():
try: try:
with open(stateFile, mode="w+", encoding="utf8") as outFile: with open(stateFile, mode="w+", encoding="utf8") as outFile:
json.dump(self.theState, outFile, indent=2) json.dump(self.theState, outFile, indent=2)
except Exception as e: except Exception:
logger.error("Failed to save GUI options file") logger.error("Failed to save GUI options file")
logger.error(str(e)) nw.logException()
return False return False
return True return True
+23 -18
View File
@@ -1219,9 +1219,9 @@ class NWProject():
if len(theLines) != 4: if len(theLines) != 4:
return ["ERROR"] return ["ERROR"]
except Exception as e: except Exception:
logger.error("Failed to read project lockfile") logger.error("Failed to read project lockfile")
logger.error(str(e)) nw.logException()
return ["ERROR"] return ["ERROR"]
return theLines return theLines
@@ -1240,9 +1240,9 @@ class NWProject():
outFile.write("%s\n" % self.mainConf.kernelVer) outFile.write("%s\n" % self.mainConf.kernelVer)
outFile.write("%d\n" % time()) outFile.write("%d\n" % time())
except Exception as e: except Exception:
logger.error("Failed to write project lockfile") logger.error("Failed to write project lockfile")
logger.error(str(e)) nw.logException()
return False return False
return True return True
@@ -1257,9 +1257,9 @@ class NWProject():
if os.path.isfile(lockFile): if os.path.isfile(lockFile):
try: try:
os.unlink(lockFile) os.unlink(lockFile)
except Exception as e: except Exception:
logger.error("Failed to remove project lockfile") logger.error("Failed to remove project lockfile")
logger.error(str(e)) nw.logException()
return False return False
return True return True
@@ -1415,9 +1415,9 @@ class NWProject():
self.notesWCount, self.notesWCount,
)) ))
except Exception as e: except Exception:
logger.error("Failed to write session stats file") logger.error("Failed to write session stats file")
logger.error(str(e)) nw.logException()
return False return False
return True return True
@@ -1453,17 +1453,19 @@ class NWProject():
os.rename(theFile, newPath) os.rename(theFile, newPath)
logger.info("Moved file: %s" % theFile) logger.info("Moved file: %s" % theFile)
logger.info("New location: %s" % newPath) logger.info("New location: %s" % newPath)
except Exception as e: except Exception:
logger.error(str(e))
errList.append("Could not move: %s" % theFile) errList.append("Could not move: %s" % theFile)
logger.error("Could not move: %s" % theFile)
nw.logException()
elif len(dataItem) == 21 and dataItem.endswith("_main.bak"): elif len(dataItem) == 21 and dataItem.endswith("_main.bak"):
try: try:
os.unlink(theFile) os.unlink(theFile)
logger.info("Deleted file: %s" % theFile) logger.info("Deleted file: %s" % theFile)
except Exception as e: except Exception:
logger.error(str(e))
errList.append("Could not delete: %s" % theFile) errList.append("Could not delete: %s" % theFile)
logger.error("Could not delete: %s" % theFile)
nw.logException()
else: else:
theErr = self._moveUnknownItem(theData, dataItem) theErr = self._moveUnknownItem(theData, dataItem)
@@ -1475,9 +1477,10 @@ class NWProject():
try: try:
os.rmdir(theData) os.rmdir(theData)
logger.info("Removed folder: %s" % theFolder) logger.info("Removed folder: %s" % theFolder)
except Exception as e: except Exception:
logger.error(str(e))
errList.append("Failed to remove: %s" % theFolder) errList.append("Failed to remove: %s" % theFolder)
logger.error("Failed to remove: %s" % theFolder)
nw.logException()
return errList return errList
@@ -1495,8 +1498,9 @@ class NWProject():
try: try:
os.rename(theSrc, theDst) os.rename(theSrc, theDst)
logger.info("Moved to junk: %s" % theSrc) logger.info("Moved to junk: %s" % theSrc)
except Exception as e: except Exception:
logger.error(str(e)) logger.error("Could not move item %s to junk." % theSrc)
nw.logException()
return "Could not move item %s to junk." % theSrc return "Could not move item %s to junk." % theSrc
return "" return ""
@@ -1529,8 +1533,9 @@ class NWProject():
logger.info("Deleting: %s" % rmFile) logger.info("Deleting: %s" % rmFile)
try: try:
os.unlink(rmFile) os.unlink(rmFile)
except Exception as e: except Exception:
logger.error(str(e)) logger.error("Could not delete: %s" % rmFile)
nw.logException()
return False return False
return True return True
+8 -8
View File
@@ -72,9 +72,9 @@ class NWSpellCheck():
with open(self.projectDict, mode="a+", encoding="utf-8") as outFile: with open(self.projectDict, mode="a+", encoding="utf-8") as outFile:
outFile.write("%s\n" % newWord) outFile.write("%s\n" % newWord)
self.projDict.append(newWord) self.projDict.append(newWord)
except Exception as e: except Exception:
logger.error("Failed to add word to project word list %s" % str(self.projectDict)) logger.error("Failed to add word to project word list %s" % str(self.projectDict))
logger.error(str(e)) nw.logException()
return False return False
return True return True
return False return False
@@ -123,9 +123,9 @@ class NWSpellCheck():
if len(theLine) > 0 and theLine not in self.projDict: if len(theLine) > 0 and theLine not in self.projDict:
self.projDict.append(theLine) self.projDict.append(theLine)
logger.debug("Project word list contains %d words" % len(self.projDict)) logger.debug("Project word list contains %d words" % len(self.projDict))
except Exception as e: except Exception:
logger.error("Failed to load project word list") logger.error("Failed to load project word list")
logger.error(str(e)) nw.logException()
return False return False
return True return True
@@ -201,9 +201,9 @@ class NWSpellEnchant(NWSpellCheck):
try: try:
spTag = self.theDict.tag spTag = self.theDict.tag
spName = self.theDict.provider.name spName = self.theDict.provider.name
except Exception as e: except Exception:
logger.error("Failed to extract information about the dictionary") logger.error("Failed to extract information about the dictionary")
logger.error(str(e)) nw.logException()
spTag = "" spTag = ""
spName = "" spName = ""
@@ -261,9 +261,9 @@ class NWSpellSimple(NWSpellCheck):
logger.debug("Spell check word list for language %s loaded" % theLang) logger.debug("Spell check word list for language %s loaded" % theLang)
logger.debug("Word list contains %d words" % len(self.WORDS)) logger.debug("Word list contains %d words" % len(self.WORDS))
self.spellLanguage = theLang self.spellLanguage = theLang
except Exception as e: except Exception:
logger.error("Failed to load spell check word list for language %s" % theLang) logger.error("Failed to load spell check word list for language %s" % theLang)
logger.error(str(e)) nw.logException()
self.spellLanguage = None self.spellLanguage = None
self._readProjectDictionary(projectDict) self._readProjectDictionary(projectDict)
+4 -2
View File
@@ -24,6 +24,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import nw
import logging import logging
import os import os
@@ -179,8 +180,9 @@ class NWTree():
outFile.write("\n".join(tocList)) outFile.write("\n".join(tocList))
outFile.write("\n") outFile.write("\n")
except Exception as e: except Exception:
logger.error(str(e)) logger.error("Could not write ToC file")
nw.logException()
return False return False
return True return True
+1 -1
View File
@@ -39,7 +39,7 @@ logger = logging.getLogger(__name__)
# Utility Functions # Utility Functions
# =============================================================================================== # # =============================================================================================== #
def logException(exObj): def logException():
"""Log the content of an exception message. """Log the content of an exception message.
""" """
exType, exValue, _ = sys.exc_info() exType, exValue, _ = sys.exc_info()
+6 -6
View File
@@ -671,9 +671,9 @@ class GuiBuildNovel(QDialog):
bldObj.doConvert() bldObj.doConvert()
bldObj.doPostProcessing() bldObj.doPostProcessing()
except Exception as e: except Exception:
logger.error("Failed to generate html of document '%s'" % tItem.itemHandle) logger.error("Failed to generate html of document '%s'" % tItem.itemHandle)
logger.error(str(e)) nw.logException()
if isPreview: if isPreview:
self.docView.setText(( self.docView.setText((
"Failed to generate preview. " "Failed to generate preview. "
@@ -997,9 +997,9 @@ class GuiBuildNovel(QDialog):
with open(buildCache, mode="r", encoding="utf8") as inFile: with open(buildCache, mode="r", encoding="utf8") as inFile:
theJson = inFile.read() theJson = inFile.read()
theData = json.loads(theJson) theData = json.loads(theJson)
except Exception as e: except Exception:
logger.error("Failed to load build cache") logger.error("Failed to load build cache")
logger.error(str(e)) nw.logException()
return False return False
if "htmlText" in theData.keys(): if "htmlText" in theData.keys():
@@ -1026,9 +1026,9 @@ class GuiBuildNovel(QDialog):
"htmlStyle" : self.htmlStyle, "htmlStyle" : self.htmlStyle,
"buildTime" : self.buildTime, "buildTime" : self.buildTime,
}, indent=2)) }, indent=2))
except Exception as e: except Exception:
logger.error("Failed to save build cache") logger.error("Failed to save build cache")
logger.error(str(e)) nw.logException()
return False return False
return True return True
+2 -2
View File
@@ -180,9 +180,9 @@ class GuiDocViewer(QTextBrowser):
aDoc.tokenizeText() aDoc.tokenizeText()
aDoc.doConvert() aDoc.doConvert()
aDoc.doPostProcessing() aDoc.doPostProcessing()
except Exception as e: except Exception:
logger.error("Failed to generate preview for document with handle '%s'" % tHandle) logger.error("Failed to generate preview for document with handle '%s'" % tHandle)
logger.error(str(e)) nw.logException()
self.setText("An error occurred while generating the preview.") self.setText("An error occurred while generating the preview.")
return False return False
+8 -8
View File
@@ -265,9 +265,9 @@ class GuiTheme:
if os.path.isfile(self.cssFile): if os.path.isfile(self.cssFile):
with open(self.cssFile, mode="r", encoding="utf8") as inFile: with open(self.cssFile, mode="r", encoding="utf8") as inFile:
cssData = inFile.read() cssData = inFile.read()
except Exception as e: except Exception:
logger.error("Could not load theme css file") logger.error("Could not load theme css file")
logger.error(str(e)) nw.logException()
return False return False
# Config File # Config File
@@ -275,9 +275,9 @@ class GuiTheme:
try: try:
with open(self.confFile, mode="r", encoding="utf8") as inFile: with open(self.confFile, mode="r", encoding="utf8") as inFile:
confParser.read_file(inFile) confParser.read_file(inFile)
except Exception as e: except Exception:
logger.error("Could not load theme settings from: %s" % self.confFile) logger.error("Could not load theme settings from: %s" % self.confFile)
logger.error(str(e)) nw.logException()
return False return False
## Main ## Main
@@ -333,9 +333,9 @@ class GuiTheme:
try: try:
with open(self.syntaxFile, mode="r", encoding="utf8") as inFile: with open(self.syntaxFile, mode="r", encoding="utf8") as inFile:
confParser.read_file(inFile) confParser.read_file(inFile)
except Exception as e: except Exception:
logger.error("Could not load syntax colours from: %s" % self.syntaxFile) logger.error("Could not load syntax colours from: %s" % self.syntaxFile)
logger.error(str(e)) nw.logException()
return False return False
## Main ## Main
@@ -637,9 +637,9 @@ class GuiIcons:
try: try:
with open(self.confFile, mode="r", encoding="utf8") as inFile: with open(self.confFile, mode="r", encoding="utf8") as inFile:
confParser.read_file(inFile) confParser.read_file(inFile)
except Exception as e: except Exception:
logger.error("Could not load icon theme settings from: %s" % self.confFile) logger.error("Could not load icon theme settings from: %s" % self.confFile)
logger.error(str(e)) nw.logException()
return False return False
## Main ## Main