不思議な動作

ある機能で、凄く簡略化すると以下のようなコードがあったのですが、例外が投げられずに str.SubString(0, a); が実行されてしまい、そこで実行時例外が発生しました。えーっと、なんなんでしょう???デバッカで止めてみても、確かに a == -1, b == -1なのです。

string str = "〜";
int a = -1, b = -1;
if (a <= 0 || b < 0) {
  throw new Exception();
}
str.SubString(0, a);
return 0;

何か言語仕様で勘違いしているところがあるのでしょうか?throwした場合は、その先のコードが評価されないと思っていたのですが、、、。try 〜 catchがなく AppDomainの UnhandledExceptionで catchしているのが何か関係するのでしょうか?識者の方、教えていただけると嬉しいです。