System.Web.Http.HttpResponseException в блоке catch при обработке исключений - PullRequest
0 голосов
/ 02 декабря 2018

Я намеренно нарушаю уникальное ограничение в моей базе данных и пытаюсь обработать исключение.

Это, помимо прочего, в моей форме:

HttpResponseMessage response = KorisniciService.PostResponse(k);
                if (response.IsSuccessStatusCode)
                {
                    MessageBox.Show(Messages.add_usr_succ);
                    DialogResult = DialogResult.OK;
                    Close();
                }
                else
                {
                    string message = response.ReasonPhrase;
                    if (string.IsNullOrEmpty(Messages.ResourceManager.GetString(response.ReasonPhrase)))
                        message = Messages.ResourceManager.GetString(response.ReasonPhrase);


                    MessageBox.Show("Error code: " + response.StatusCode + " Message: " + message);
                }

Мой контроллер:

public IHttpActionResult PostKorisnici(Korisnici obj)
        {
            if (!ModelState.IsValid)
                return BadRequest();
            try
            {
                obj.KorisnikId = Convert.ToInt32(dm.esp_Korisnici_Insert(obj.Ime, obj.Prezime, obj.Email, obj.Telefon, obj.KorisnickoIme, obj.LozinkaSalt, obj.LozinkaHash, obj.Status, obj.Adresa, obj.GradId).FirstOrDefault());
            }
            catch (EntityException ex)
            {
                throw CreateHttpResponseException(Util.ExceptionHandler.HandleException(ex), HttpStatusCode.Conflict);
            }


            foreach (var item in obj.Uloge)
            {
                    dm.esp_KorisniciUloge_Insert(obj.KorisnikId, item.UlogaId);
            }
            return CreatedAtRoute("DefaultApi", new { id = obj.KorisnikId }, obj);
        }

Функция создания исключения HttpResponseException:

private HttpResponseException CreateHttpResponseException(string reason, HttpStatusCode code)
        {


            HttpResponseMessage msg = new HttpResponseMessage()
            {
                StatusCode = code,
                ReasonPhrase = reason,
                Content = new StringContent(reason)
            };
            return new HttpResponseException(Request.CreateResponse(msg));
        }

Класс обработчика исключений:

public class ExceptionHandler
    {
        public static string HandleException(EntityException error)
        {

            SqlException ex = error.InnerException as SqlException;

                switch (ex.Number)
                {
                    case 2627:
                    {
                        return GetConstraintExceptionMessage(ex);
                    }
                    default:
                        return error.Message + "(" + error +")";
                }
        }
        /*Message "Violation of UNIQUE KEY constraint 'CS_KorisnickoIme'. Cannot insert duplicate key in object 'dbo.Korisnici'. The duplicate key value is (farish).\r\nThe statement has been terminated."    string*/

        private static string GetConstraintExceptionMessage(SqlException error)
        {
            string newMessage = error.Message;
            int startIndex = newMessage.IndexOf("'");
            int endIndex = newMessage.IndexOf("'", startIndex + 1);

            if (startIndex>0 && endIndex>0)
            {
                string constraintName = newMessage.Substring(startIndex + 1, endIndex - startIndex - 1);

                if (constraintName == "CS_KorisnickoIme")
                    newMessage = "username_con";
                else if (constraintName == "CS_Email")
                    newMessage = "email_con";


            }
             return newMessage;
        }

Поэтому, когда я выдаю ошибку, вместо всплывающего окна (которое показываетв учебном видео) Я получаю System.Web.Http.HttpResponseException в первом блоке catch моего метода post , и ничто не передается обратно в мою форму.

1 Ответ

0 голосов
/ 02 декабря 2018

Я думаю, потому что исключение генерируется, а не внутри блока try / catch, или блок catch, получающий исключение CreateHttpResponseException, поглощает его и не предоставляет объект ответа.

EDIT Можете ли вы опубликовать код для KorisniciService.PostResponse?

, и ничего не вернулось в мою форму

И каков окончательный результат?Из кода формы, который вы опубликовали, должно появиться либо всплывающее окно с сообщением об успешном завершении, либо всплывающее окно с сообщением об ошибке.Что на самом деле происходит?

2-е РЕДАКТИРОВАНИЕ

После получения дополнительной информации используйте это в своем коде формы ...

try
{
    HttpResponseMessage response = KorisniciService.PostResponse(k);

    if (response.IsSuccessStatusCode)
    {
        MessageBox.Show(Messages.add_usr_succ);
        DialogResult = DialogResult.OK;
        Close();
    }
}
catch(HttpResponseException ex)
{
    string message = ex.ReasonPhrase;

    if (string.IsNullOrEmpty(Messages.ResourceManager.GetString(ex.ReasonPhrase)))
        message = Messages.ResourceManager.GetString(ex.ReasonPhrase);


    MessageBox.Show("Error code: " + ex.StatusCode + " Message: " + message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...