MySql: битый текст исключения при отсутствии соединения
Добавлено: Ср 25 май 2016 05:22
При потере соединения MySQL выбрасывается исключение с крякозябрами - результатом ошибочного преобразования системного Unicode-текста ошибки из UTF-8.
Для воспроизведения нужно:
UniConnection.SpecificOptions.Values['UseUnicode'] := 'True';
UniConnection.SpecificOptions.Values['Direct'] := 'True';
Соединение разрывать не обязательно, можно сэмулировать ошибку исправлением TCRVioTcp.ReadNoWait - закомментировать проверку результата и указать код ошибки, например, 10060:
В результате будет получена строка ошибки, которая в конце концов передается в метод TMySQLConnection.MySQLError, где и происходит ошибочное преобразование из UTF8
, но этого не нужно, т.к. текст ошибки был получен с помощью метода SysErrorMessage.
Для воспроизведения нужно:
UniConnection.SpecificOptions.Values['UseUnicode'] := 'True';
UniConnection.SpecificOptions.Values['Direct'] := 'True';
Соединение разрывать не обязательно, можно сэмулировать ошибку исправлением TCRVioTcp.ReadNoWait - закомментировать проверку результата и указать код ошибки, например, 10060:
Код: Выделить всё
function InernalReceive(Loop: integer): integer;
begin
Result := recv(FSd, buffer[offset], count, 0);
// if Result = SOCKET_ERROR then begin
// {$IFDEF UNIX}
// if (GetSocketError = ESysEINTR) and (Loop > 0) then begin
// sleep(50);
// Result := InernalReceive(Loop - 1);
// end
// else
// {$ENDIF}
begin
// FLastErrorCode := GetSocketError;
FLastErrorCode := 10060;
FLastError := Format(SErrorOnDataReading, [SysErrorMessage(FLastErrorCode), FLastErrorCode, FLastErrorCode]);
Result := 0; // silent error handling
end;
// end;
end;
Код: Выделить всё
if FUseUnicode then
Msg := string(CRFunctions.UTF8Decode(MsgBuf))