home · contact · privacy
Differentiate error messaging. master
authorPlom Heller <plom@plomlompom.com>
Sun, 1 Nov 2026 14:29:04 +0000 (15:29 +0100)
committerPlom Heller <plom@plomlompom.com>
Sun, 1 Nov 2026 14:29:04 +0000 (15:29 +0100)
src/bookmaker/misc.py

index d5a8d9ecc1cdc6654c6d6bc33414f1dc08a02a91..767c32f56affd4b7c4cb891130b02adeac40f163 100755 (executable)
@@ -342,21 +342,32 @@ class Nup4Geometry:
         self.shrink_for_spine = 1 - spine_part_of_page
 
 
         self.shrink_for_spine = 1 - spine_part_of_page
 
 
-class ArgFail(Exception):
-    'Collects relevant command character, followed by explanation.'
+class MsgFail(Exception):
+    'Collects relevant explanation.'
 
     def __init__(
             self,
 
     def __init__(
             self,
-            arg_char: str,
             msg: str,
             *args,
             **kwargs
             ) -> None:
         super().__init__(*args, **kwargs)
             msg: str,
             *args,
             **kwargs
             ) -> None:
         super().__init__(*args, **kwargs)
-        self.arg_char = arg_char
         self.msg = msg
 
 
         self.msg = msg
 
 
+class ArgFail(MsgFail):
+    'Collects relevant command character, with explanation.'
+
+    def __init__(
+            self,
+            arg_char: str,
+            *args,
+            **kwargs
+            ) -> None:
+        super().__init__(*args, **kwargs)
+        self.arg_char = arg_char
+
+
 def parse_args(
         ) -> ArgsNamespace:
     'Collect command line arguments.'
 def parse_args(
         ) -> ArgsNamespace:
     'Collect command line arguments.'
@@ -427,15 +438,14 @@ def _validate_args_syntax(
     'Check command args against general syntax expectations.'
 
     def validate_page_range(
     'Check command args against general syntax expectations.'
 
     def validate_page_range(
-            pr_string: str,
-            arg_char: str
+            pr_string: str
             ) -> None:
         prefix = 'page range string'
         if '-' not in pr_string:
             ) -> None:
         prefix = 'page range string'
         if '-' not in pr_string:
-            raise ArgFail(arg_char, f'{prefix} lacks "-": {pr_string}')
+            raise MsgFail(f'{prefix} lacks "-": {pr_string}')
         tokens = pr_string.split('-')
         if len(tokens) > 2:
         tokens = pr_string.split('-')
         if len(tokens) > 2:
-            raise ArgFail(arg_char, f'{prefix} has too many "-": {pr_string}')
+            raise MsgFail(f'{prefix} has too many "-": {pr_string}')
         for i, token in enumerate(tokens):
             if token == '':
                 continue
         for i, token in enumerate(tokens):
             if token == '':
                 continue
@@ -446,12 +456,10 @@ def _validate_args_syntax(
             try:
                 int(token)
             except ValueError as e:
             try:
                 int(token)
             except ValueError as e:
-                raise ArgFail(arg_char,
-                              f'{prefix} carries value neither integer, '
+                raise MsgFail(f'{prefix} carries value neither integer, '
                               f'nor "start", nor "end": {pr_string}') from e
             if int(token) < 1:
                               f'nor "start", nor "end": {pr_string}') from e
             if int(token) < 1:
-                raise ArgFail(arg_char,
-                              f'{prefix} carries page number <1: {pr_string}')
+                raise MsgFail(f'{prefix} carries page number <1: {pr_string}')
         start = -1
         end = -1
         try:
         start = -1
         end = -1
         try:
@@ -460,45 +468,47 @@ def _validate_args_syntax(
         except ValueError:
             pass
         if start > end > 0:
         except ValueError:
             pass
         if start > end > 0:
-            raise ArgFail(
-                    arg_char,
+            raise MsgFail(
                     f'{prefix} has higher start than end value: {pr_string}')
 
                     f'{prefix} has higher start than end value: {pr_string}')
 
-    if args.page_range:
-        for p_string in args.page_range:
-            validate_page_range(p_string, 'p')
-        if len(args.page_range) > len(args.input_file):
-            raise ArgFail(
-                    'p',
+    try:
+        if args.page_range:
+            arg_char = 'p'
+            for p_string in args.page_range:
+                validate_page_range(p_string)
+            if len(args.page_range) > len(args.input_file):
+                raise MsgFail(
                     'more --page_range arguments than --input_file arguments')
                     'more --page_range arguments than --input_file arguments')
-    if args.crops:
-        for c_string in args.crops:
-            initial_split = c_string.split(':')
-            if len(initial_split) > 2:
-                raise ArgFail('c',
-                              f'cropping string has multiple ":": {c_string}')
-            page_range, crops_str = split_crops_string(c_string)
-            crops = crops_str.split(',')
-            if page_range:
-                validate_page_range(page_range, 'c')
-            if len(crops) != 4:
-                raise ArgFail(
-                    'c',
-                    f'cropping does not contain exactly three ",": {c_string}')
-            for crop in crops:
+        if args.crops:
+            arg_char = 'c'
+            for c_string in args.crops:
+                initial_split = c_string.split(':')
+                if len(initial_split) > 2:
+                    raise MsgFail(
+                            f'cropping string has multiple ":": {c_string}')
+                page_range, crops_str = split_crops_string(c_string)
+                crops = crops_str.split(',')
+                if page_range:
+                    validate_page_range(page_range)
+                if len(crops) != 4:
+                    raise MsgFail('cropping does not contain exactly three '
+                                  f'",": {c_string}')
+                for crop in crops:
+                    try:
+                        float(crop)
+                    except ValueError as e:
+                        raise MsgFail(f'non-number crop in: {c_string}') from e
+        if args.rotate_page:
+            arg_char = 'r'
+            for r in args.rotate_page:
                 try:
                 try:
-                    float(crop)
+                    int(r)
                 except ValueError as e:
                 except ValueError as e:
-                    raise ArgFail('c',
-                                  f'non-number crop in: {c_string}') from e
-    if args.rotate_page:
-        for r in args.rotate_page:
-            try:
-                int(r)
-            except ValueError as e:
-                raise ArgFail('r', f'non-integer value: {r}') from e
-            if r < 1:
-                raise ArgFail('r', 'value must not be <1: {r}')
+                    raise MsgFail(f'non-integer value: {r}') from e
+                if r < 1:
+                    raise MsgFail('value must not be <1: {r}')
+    except MsgFail as e:
+        raise ArgFail(arg_char, e.msg)
     try:
         float(args.print_margin)
     except ValueError as e:
     try:
         float(args.print_margin)
     except ValueError as e: