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

@ -708,6 +708,7 @@ class CuraContainerRegistry(ContainerRegistry):
try: try:
instance_container.deserialize(serialized, file_path) instance_container.deserialize(serialized, file_path)
except ContainerFormatError: except ContainerFormatError:
Logger.logException("e", "Unable to deserialize InstanceContainer %s", file_path)
continue continue
self.addContainer(instance_container) self.addContainer(instance_container)
break break

View file

@ -12,7 +12,6 @@ import xml.etree.ElementTree as ET
from UM.Workspace.WorkspaceReader import WorkspaceReader from UM.Workspace.WorkspaceReader import WorkspaceReader
from UM.Application import Application from UM.Application import Application
from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
from UM.Logger import Logger from UM.Logger import Logger
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from UM.Signal import postponeSignals, CompressTechnique from UM.Signal import postponeSignals, CompressTechnique
@ -337,7 +336,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
try: try:
instance_container.deserialize(serialized, file_name = instance_container_file_name) instance_container.deserialize(serialized, file_name = instance_container_file_name)
except ContainerFormatError: 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: if quality_changes[0] != instance_container:
quality_changes_conflict = True quality_changes_conflict = True
elif container_type == "quality": elif container_type == "quality":
@ -648,7 +649,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"), definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"),
file_name = definition_container_file) file_name = definition_container_file)
except ContainerFormatError: 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) self._container_registry.addContainer(definition_container)
Job.yieldThread() Job.yieldThread()
@ -691,7 +696,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"), material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"),
file_name = container_id + "." + self._material_container_suffix) file_name = container_id + "." + self._material_container_suffix)
except ContainerFormatError: 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: if need_new_name:
new_name = ContainerRegistry.getInstance().uniqueName(material_container.getName()) new_name = ContainerRegistry.getInstance().uniqueName(material_container.getName())
material_container.setName(new_name) material_container.setName(new_name)