Jak rozpoznać gdzie wystąpił wyjątek

0
StringBuilder builder;
string str;
try
{
   //...
   builder.Append(str[i]);
   //... dalej wielokrotnie odwoluje sie do str[i] oraz builder.Append
}
catch(ArgumentOutOfRangeException e)
{
   if(/* e pochodzi z builder.Append */) throw e;
   //...
}

Zarówno 'builder.Append(...)' jak i 'str[...]' może rzucić wyjątkiem ArgumentOutOfRangeException. Jak sprawdzić który to z nich ?

0

Może to pomoże:
ParamName - Gets the name of the parameter that causes this exception.(Inherited from ArgumentException.)
Source - Gets or sets the name of the application or the object that causes the error.(Inherited from Exception.)

Są to właściwości obiektu ArgumentOutOfRangeException.

0

Wiem, wiem, ale

ParamName - na pewno i zawsze będzie to "value" / "index" ?
Source - na pewno i zawsze będzie kończyć się na "StringBuilder" / "String" ?

W zasadzie teraz nie jest mi to potrzebne, ale co jeśli będę miał 2 obiekty tego samego typu i będę chciał rozróżnić w którym wystąpił wyjątek ? Czy wtedy jestem skazany na rozbicie jednego bloku try...cach na kilka ?

0

Nie jestem w 100% procentach pewien że tak bedzie - nie używałem tego.
Spróbuj wywołać kilka wyjatków i się przekonaj.

Konstruktor tej klasy przyjmuje kilka parametrów i może to być sama wiadomośc lub równie dobrze mogą być podane wszystkie dane..... nie wiem sprawdż.

0

Exception.StackTrace zawiera nazwę metody jaka wywołała wyjątek.

0

Jeśli zawiera TYLKO nazwę metody to raczej nie pomoże - wszystko jest w jednej metodzie.

0

niezupełnie : StackTrace podaje wszystkie metody w kolejności jakie były wywoływane (ostatnia, ta która wyrzuci wyjątek - będzie na pierwszym miejscu czyli na samej górze). Warto sprawdzić info jakie wywala - może akurat będzie wystarczające dla Twoich celów.

0

Proponuje sprawdzić str[] zanim go użyjesz (długość, null) i sprawa załatwiona.

0
jard napisał(a)

Proponuje sprawdzić str[] zanim go użyjesz (długość, null) i sprawa załatwiona.
Taaaa, w 25 miejscach. Nie, dziękuję.

StackTrace to jest to, dzięki Deti.

0

Jeżeli masz ten sam kod w 25 miejscach to chyba coś nie halo. Zasada DRY (don't repeat yourself).

0

Nie mam tego samego kodu. Pisze pewien parser i w wielu miejscach (trochę przesadziłem z tymi 25) odwołuje się do 'str[i]' i za każdym razem w innym kontekście. I właśnie dlatego żeby się nie powtarzać chcę po prostu przechwycić wyjątek, kiedy łańcucha zabraknie (dopiero po przeparsowaniu wiem gdzie jest koniec).

0

Dodam jeszcze, że za pomocą

System.Diagnostics.TraceError() możesz w kodzie dopisać na stosie swoją informację (gdyby zaszła taka potrzeba).

0

Wszystko jasne, ale możesz napisać przecież funkcję w stylu:

public void CheckString(string input)
{
if(input == null) {
throw ....
}
if(input.Equals(String.Empty)) {
throw ....
}

// inne warunki jakie musi spełniać string

}

0

Ale po co jak taka funkcja już jest wbudowana w string ???

1 użytkowników online, w tym zalogowanych: 0, gości: 1