# Refactor: replace empty catch in ExtractTileCoordinatesFromFilename

**Task**: AZ-352_refactor_replace_empty_catch_extract_tile_coords
**Name**: Remove silent empty catch in tile-coord parser
**Description**: Replace the empty `catch { }` in `RouteProcessingService.ExtractTileCoordinatesFromFilename` with a typed catch + warning log.
**Complexity**: 2 points
**Dependencies**: None
**Component**: Services.RouteManagement
**Tracker**: AZ-352
**Epic**: AZ-350

## Problem

`SatelliteProvider.Services.RouteManagement/RouteProcessingService.cs:610-630` swallows every parse/IO exception with `catch { }` and returns `(-1, -1)`. Callers treat this as "tile not stitchable" — the tile silently disappears from the route map. Direct violation of `coderule.mdc` ("Never suppress errors silently").

## Outcome

- Malformed filenames produce a visible warning log entry.
- Unexpected exception types propagate up the call stack instead of being swallowed.
- 37 unit + 5 smoke tests stay green.

## Scope

### Included
- Replace `catch { }` with `catch (FormatException) { ... } catch (ArgumentException) { ... }` plus warning log via the existing `_logger`.
- Let any other exception propagate.
- Add a unit test that feeds a malformed filename and asserts on the warning log entry.

### Excluded
- Changing the filename format or the writer side (`StorageConfig.GetTileFilePath`).
- Changing the `(-1, -1)` sentinel — that lives until C13 reorganizes the parser/writer pairing.

## Acceptance Criteria

**AC-1: Malformed filename logs a warning**
Given a file that does not match the `tile_{ts}_{x}_{y}.jpg` pattern
When `ExtractTileCoordinatesFromFilename` is called on it
Then the function returns `(-1, -1)` AND a warning log entry is emitted naming the file.

**AC-2: Unexpected exception propagates**
Given a hypothetical unrelated exception (e.g., `IOException`) raised inside the parser
When `ExtractTileCoordinatesFromFilename` is called
Then the exception is not swallowed and propagates to the caller.

**AC-3: Tests stay green**
Given the post-refactor build
When `scripts/run-tests.sh --smoke` runs
Then all 37 unit + 5 smoke scenarios pass.

## Constraints

- Behavior for valid filenames must be byte-identical.

## Risks & Mitigation

**Risk 1: existing callers may rely on the swallow-all behavior**
- *Risk*: another path in `RouteProcessingService` may pass arbitrary file lists where IO errors are expected.
- *Mitigation*: grep all callers; if any expects swallow-all, add explicit handling at that call site.

Full change entry: `_docs/04_refactoring/03-code-quality-refactoring/list-of-changes.md` (C02).
