Generowanie informacji o błędzie

Jeśli serwer lub aplikacja napotka błąd krytyczny podczas wywołania przez RPC, powinien wskazać środowisku uruchomieniowemu RPC, że napotkał błąd, a najlepiej dodać informacje o niepowodzeniu, aby ułatwić rozwiązywanie problemów.

Wskazuje błędy krytyczne w czasie wykonywania RPC

Aby wskazać błąd czasu wykonywania RPC, wywołaj funkcję RpcRaiseException, będąc w wątku RPC, na którym został wywołany wyjątek, lub RpcAsyncAbortCall, jeśli asynchroniczne przetwarzanie wywołania odbywa się w innym wątku. Zwracanie kodu błędu z procedury serwera, takiej jak procedura menedżera, nie jest wystarczające — zgodnie ze specyfikacją RPC zwracana wartość funkcji nie ma semantyki błędów na serwerze, niezależnie od ustawień pliku idl/acf.

W przypadku wystąpienia błędu krytycznego w składniku wykonaj wszelkie czynności oczyszczania uznane za niezbędne, a następnie wywołaj funkcję RpcRaiseException z kodem błędu. Jedyną różnicą między RpcRaiseException a zwróceniem kodu błędu jest to, że gdy RpcRaiseException jest wywoływana, parametry out nie są przekazywane. Zwykle jest to zaleta, ponieważ unikanie niezainicjowanych parametrów wyjściowych staje się zbędne.

Generowanie dodatkowych rozszerzonych informacji o błędzie

Podobnie jak czas wykonywania RPC tworzy łańcuch rekordów błędów, serwer lub aplikacja może dodać własne rekordy do łańcucha. Takie podejście często pomaga w procesie rozwiązywania problemów. Na przykład serwer może próbować otworzyć dany plik i otrzymać błąd nie znaleziono pliku. Po prostu zwracanie błędu 2 nie byłoby pomocne podczas określania, którego pliku brakuje.

Zamiast tego serwer może wywołać funkcję RpcErrorAddRecord i podać parametr ciągu ANSI lub Unicode w rekordzie błędu wskazującym pełną ścieżkę pliku, którego szukano. Gdy wszystkie te informacje pojawią się na ekranie użytkownika na komputerze zdalnym, rozwiązywanie problemów staje się proste; Proste sprawdzenie, czy plik istnieje, można wykonać, zwłaszcza że nazwa danego komputera jest już udostępniana przez czas wykonywania RPC.

Wywołanie funkcji RpcErrorAddRecord może zakończyć się niepowodzeniem, jeśli nie ma wystarczającej ilości dostępnej pamięci, mimo że wymaga tylko kilku bajtów pamięci sterty. Ponadto rekordy dodane przez RpcErrorAddRecord gromadzą się w danym wątku. Środowisko uruchomieniowe zwykle czyści te rekordy przed wywołaniem procedury serwera, ale jeśli rozszerzone informacje o błędzie są używane poza RPC, należy zadbać o czyszczenie skumulowanego błędu rozszerzonego w wątku przez wywołanie RpcErrorClearInformation.