Ten kod jest częścią aplikacji, która odczytuje i zapisuje w bazie danych połączonej z ODBC. Tworzy rekord w bazie danych, a następnie sprawdza, czy rekord został pomyślnie utworzony, a następnie zwraca true
.
Moje rozumienie przepływu kontroli jest następujące:
command.ExecuteNonQuery()
jest udokumentowane, aby InvalidOperationException
zgłosić, gdy „wywołanie metody jest nieprawidłowe dla bieżącego stanu obiektu”. Dlatego, gdyby tak się stało, wykonanie try
bloku zatrzymałoby się, finally
blok zostałby wykonany, a następnie zostałby wykonany return false;
na dole.
Jednak moje IDE twierdzi, że return false;
kod jest nieosiągalny. I wydaje się, że to prawda, mogę go usunąć i kompiluje bez żadnych skarg. Jednak dla mnie wygląda na to, że nie byłoby wartości zwracanej dla ścieżki kodu, w której jest zgłaszany wspomniany wyjątek.
private static bool createRecord(String table,
IDictionary<String,String> data,
System.Data.IDbConnection conn,
OdbcTransaction trans) {
[... some other code ...]
int returnValue = 0;
try {
command.CommandText = sb.ToString();
returnValue = command.ExecuteNonQuery();
return returnValue == 1;
} finally {
command.Dispose();
}
return false;
}
Jaki jest mój błąd zrozumienia?
Dispose
wyraźnie, ale umieść using
:using (var command = ...) {command.CommandText = sb.ToString(); return command.ExecuteNonQuery(); }
finally
Blok oznacza coś innego niż myślisz.