C # Обработка исключений в классах - PullRequest
1 голос
/ 28 апреля 2009

C # 2008

Я разработал класс ниже. Я должен получить баланс с веб-сервера. Как только это будет сделано, он перезвонит в мое основное приложение с результатом.

Однако иногда веб-сервер дает сбой по неизвестной причине. Может быть большой объем трафика или что-то еще. Однако в моем классе не реализована обработка исключений. Как приложение, которое использует это обрабатывает исключение.

Однако клиент подтвердил, что при сбое веб-сервера отображается диалоговое окно необработанного исключения. Затем они должны нажать продолжить, чтобы продолжить использовать мое приложение.

Так что ниже я не уверен, должен ли я реализовать обработку исключений в моем классе. Однако я не понимаю, почему в моем приложении не было обнаружено исключение, как показано ниже.

Большое спасибо за любые предложения, или если вы видите что-то еще не так,

private void OnGetBalanceCompleted(object sender, SIPPhoneLibraryEventArgs e)
    {
        try
        {
            //If the balance starts with 'null' there has been an error trying to get the balance.
            if (e.Balance.StartsWith("null"))
            {
                statusDisplay1.CurrentBalance = CATWinSIP_MsgStrings.BalanceError;
            }
            else
            {
                // Display the current balance and round to 2 decimal places.
                statusDisplay1.CurrentBalance = Math.Round(Convert.ToDecimal(e.Balance), 2).ToString();

                //If the balance is zero display in the status message
                if (decimal.Parse(e.Balance) == 0)
                {
                    this.statusDisplay1.CallStatus = "Zero Balance";
                }
            }
            //Remove the event as no longer needed
            siplibrary.GetBalanceCompletedEvent -= new EventHandler<SIPPhoneLibraryEventArgs>(OnGetBalanceCompleted);
        }
        catch (WebException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }




//Control library for all importing functions
public class Balance : IDisposable
{
    //Constructor
    WebClient wc;
    public Balance()
    {
        using (wc = new WebClient())
        {
            //Create event handler for the progress changed and download completed events
            wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
        }
    }

    ~Balance()
    {
        this.Dispose(false);
    }

    //Event handler and the method that handlers the event
    public EventHandler<SIPPhoneLibraryEventArgs> GetBalanceCompletedEvent;

    //The method that raises the event
    public void OnGetBalanceCompleted(SIPPhoneLibraryEventArgs e)
    {
        if (GetBalanceCompletedEvent != null)
        {
            GetBalanceCompletedEvent(this, e);
        }
    }

    //Get the current balance for the user that is logged in.
    //If the balance returned from the server is NULL display error to the user.
    //Null could occur if the DB has been stopped or the server is down.       
    public void GetBalance(string sipUsername)
    {
        //Remove the underscore ( _ ) from the username, as this is not needed to get the balance.
        sipUsername = sipUsername.Remove(0, 1);

        string strURL = string.Format("http://xxx.xxx.xx.xx:xx/voipbilling/servlet/advcomm.voipbilling.GetBalance?CustomerID={0}", sipUsername);

        //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);
            // Download the current balance.
            wc.DownloadStringAsync(new Uri(strURL));
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("Busy please try again");
        }
    }

    //return and display the balance after the download has fully completed
    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        //Pass the result to the event handler
        this.OnGetBalanceCompleted(new SIPPhoneLibraryEventArgs(e.Result));
    }

    //Progress state of balance.
    void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        //Write the details to the screen.
        Console.WriteLine(e.TotalBytesToReceive);
        Console.WriteLine(e.BytesReceived);
        Console.WriteLine(e.ProgressPercentage);
    }


    //Dispose of the balance object
    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }

    //Remove the event handlers
    private bool isDisposed = false;
    private void Dispose(bool disposing)
    {
        if (!this.isDisposed)
        {
            if (disposing)
            {
                wc.DownloadProgressChanged -= new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
                wc.DownloadStringCompleted -= new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);

                wc.Dispose();
            }               
            isDisposed = true;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 28 апреля 2009

Кажется, что вы перехватываете исключение только для события OnGetBalanceCompleted, а не в процессе извлечения баланса.

Когда при извлечении возникает какая-либо ошибка, OnGetBalanceCompleted даже не вызывается, поэтому ваш обработчик исключений не вызывается.

2 голосов
/ 28 апреля 2009
  1. В исключении содержится больше информации, чем просто свойство Message. Вы выбрасываете всю эту информацию, отображая только свойство Message. Вместо этого используйте ex.ToString().
  2. Является ли размещенный вами код частью пользовательского интерфейса? Если нет, то он не имеет ничего общего с пользовательским интерфейсом. В частности, не следует использовать MessageBox.Show.
  3. Я бы удалил все элементы пользовательского интерфейса и вместо этого поднял бы событие. Вызывающий абонент прослушивает событие и выполняет любую работу с пользовательским интерфейсом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...