More clear error handling for container deserialization

CURA-5045

 - If a container cannot be deserialized in project loading, it should fail
   right on the spot because even if it continues, it still won't work.
 - In other places, at least log deserialization errors if any of them show
   up.
This commit is contained in:
Lipu Fei 2018-04-09 14:51:03 +02:00
parent 572721e20d
commit 4615c756a7
2 changed files with 12 additions and 4 deletions

View file

@ -12,7 +12,6 @@ import xml.etree.ElementTree as ET
from UM.Workspace.WorkspaceReader import WorkspaceReader
from UM.Application import Application
from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
from UM.Logger import Logger
from UM.i18n import i18nCatalog
from UM.Signal import postponeSignals, CompressTechnique
@ -337,7 +336,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
try:
instance_container.deserialize(serialized, file_name = instance_container_file_name)
except ContainerFormatError:
continue
Logger.logException("e", "Failed to deserialize InstanceContainer %s from project file %s",
instance_container_file_name, file_name)
return ThreeMFWorkspaceReader.PreReadResult.failed
if quality_changes[0] != instance_container:
quality_changes_conflict = True
elif container_type == "quality":
@ -648,7 +649,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"),
file_name = definition_container_file)
except ContainerFormatError:
continue #Skip this definition container file. Pretend there is none.
# We cannot just skip the definition file because everything else later will just break if the
# machine definition cannot be found.
Logger.logException("e", "Failed to deserialize definition file %s in project file %s",
definition_container_file, file_name)
raise
self._container_registry.addContainer(definition_container)
Job.yieldThread()
@ -691,7 +696,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"),
file_name = container_id + "." + self._material_container_suffix)
except ContainerFormatError:
continue #Pretend that this material didn't exist.
Logger.logException("e", "Failed to deserialize material file %s in project file %s",
material_container_file, file_name)
raise
if need_new_name:
new_name = ContainerRegistry.getInstance().uniqueName(material_container.getName())
material_container.setName(new_name)