From 28d787d54ceac58c60db55322870c1cd44fec030 Mon Sep 17 00:00:00 2001 From: Mikhail Yakshin Date: Tue, 22 Oct 2019 23:26:16 +0100 Subject: [PATCH] Added system of exceptions --- KaitaiStruct.cs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/KaitaiStruct.cs b/KaitaiStruct.cs index aa60c98..0fe152f 100644 --- a/KaitaiStruct.cs +++ b/KaitaiStruct.cs @@ -1,4 +1,5 @@ using System; +using System.Text; namespace Kaitai { @@ -34,4 +35,70 @@ public interface CustomDecoder /// Source byte array. byte[] Decode(byte[] src); } + + /// + /// Common ancestor for all error originating from Kaitai Struct usage. + /// Stores KSY source path, pointing to an element supposedly guilty of + /// an error. + /// + public class KaitaiStructError : Exception { + public KaitaiStructError(string msg, string srcPath) + : base(srcPath + ": " + msg) + { + this.srcPath = srcPath; + } + + protected string srcPath; + } + + /// + /// Common ancestor for all validation failures. Stores pointer to + /// KaitaiStream IO object which was involved in an error. + /// + public class ValidationFailedError : KaitaiStructError { + public ValidationFailedError(string msg, KaitaiStream io, string srcPath) + : base("at pos " + io.Pos + ": validation failed: " + msg, srcPath) + { + this.io = io; + } + + protected KaitaiStream io; + + protected static string ByteArrayToHex(byte[] arr) { + StringBuilder sb = new StringBuilder("["); + for (int i = 0; i < arr.Length; i++) + { + if (i > 0) + { + sb.Append(' '); + } + sb.Append(string.Format("{0:X2}", arr[i])); + } + sb.Append(']'); + return sb.ToString(); + } + } + + /// + /// Signals validation failure: we required "actual" value to be equal to + /// "expected", but it turned out that it's not. + /// + public class ValidationNotEqualError : ValidationFailedError { + public ValidationNotEqualError(byte[] expected, byte[] actual, KaitaiStream io, string srcPath) + : base("not equal, expected " + ByteArrayToHex(expected) + ", but got " + ByteArrayToHex(actual), io, srcPath) + { + this.expected = expected; + this.actual = actual; + } + + public ValidationNotEqualError(Object expected, Object actual, KaitaiStream io, string srcPath) + : base("not equal, expected " + expected + ", but got " + actual, io, srcPath) + { + this.expected = expected; + this.actual = actual; + } + + protected Object expected; + protected Object actual; + } }