diff --git a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs index 7ad19203d..d467ba883 100644 --- a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs @@ -351,10 +351,14 @@ namespace ICSharpCode.Decompiler.CSharp }, delegate (IGrouping file) { using (StreamWriter w = new StreamWriter(Path.Combine(targetDirectory, file.Key))) { - CSharpDecompiler decompiler = CreateDecompiler(ts); - decompiler.CancellationToken = cancellationToken; - var syntaxTree = decompiler.DecompileTypes(file.ToArray()); - syntaxTree.AcceptVisitor(new CSharpOutputVisitor(w, settings.CSharpFormattingOptions)); + try { + CSharpDecompiler decompiler = CreateDecompiler(ts); + decompiler.CancellationToken = cancellationToken; + var syntaxTree = decompiler.DecompileTypes(file.ToArray()); + syntaxTree.AcceptVisitor(new CSharpOutputVisitor(w, settings.CSharpFormattingOptions)); + } catch (Exception innerException) when (!(innerException is OperationCanceledException || innerException is DecompilerException)) { + throw new DecompilerException(module, $"Error decompiling for '{file.Key}'", innerException); + } } }); return files.Select(f => Tuple.Create("Compile", f.Key)).Concat(WriteAssemblyInfo(ts, cancellationToken)); diff --git a/ICSharpCode.Decompiler/DecompilerException.cs b/ICSharpCode.Decompiler/DecompilerException.cs index c8635d322..04ef64d50 100644 --- a/ICSharpCode.Decompiler/DecompilerException.cs +++ b/ICSharpCode.Decompiler/DecompilerException.cs @@ -25,6 +25,7 @@ using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Security; using System.Text; +using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.TypeSystem; namespace ICSharpCode.Decompiler @@ -34,20 +35,28 @@ namespace ICSharpCode.Decompiler /// public class DecompilerException : Exception, ISerializable { - public string AssemblyName => Module.AssemblyName; + public string AssemblyName => File.Name; - public string FileName => Module.PEFile.FileName; + public string FileName => File.FileName; public IEntity DecompiledEntity { get; } public IModule Module { get; } + public PEFile File { get; } public DecompilerException(MetadataModule module, IEntity decompiledEntity, Exception innerException, string message = null) - : base((message ?? "Error decompiling " + decompiledEntity?.FullName) + Environment.NewLine, innerException) + : base(message ?? "Error decompiling " + decompiledEntity?.FullName, innerException) { + this.File = module.PEFile; this.Module = module; this.DecompiledEntity = decompiledEntity; } + public DecompilerException(PEFile file, string message, Exception innerException) + : base(message, innerException) + { + this.File = file; + } + // This constructor is needed for serialization. protected DecompilerException(SerializationInfo info, StreamingContext context) : base(info, context) { @@ -71,7 +80,8 @@ namespace ICSharpCode.Decompiler + stacktrace; exceptionType = GetTypeName(exception); } - return this.Message + return this.Message + Environment.NewLine + + $"in assembly \"{this.FileName}\"" + Environment.NewLine + " ---> " + exceptionType + ": " + exception.Message + Environment.NewLine + stacktrace; }