Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
1

Обертка над исключением - Сделать так, чтобы блоки try/catch не дублировались

13.08.2014, 12:41. Просмотров 532. Ответов 13
Метки нет (Все метки)

У меня есть примерно такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
for (...) {
    if (...) {
        if (...) {
            double d;
            try {
                d = (double)someobject;
            } catch (System.InvalidCastException) {
                что-то пишем в лог
            }
            делаем что-то еще, если исключение не брошено, используя d
        } else {
            int d;
            try {
                d = (int)someobject;
            } catch (System.InvalidCastException) {
                что-то пишем в лог
            }
            делаем что-то еще, если исключение не брошено, используя d
        }
    } else {
        if (...) {
            bool d;
            try {
                d = (bool)someobject;
            } catch (System.InvalidCastException) {
                что-то пишем в лог
            }
            делаем что-то еще, если исключение не брошено, используя d
        } else {
            string d;
            try {
                d = (string)someobject;
            } catch (System.InvalidCastException) {
                что-то пишем в лог
            }
            делаем что-то еще, если исключение не брошено, используя d
        }
    }
}
Как сделать так, чтобы блоки try/catch не дублировались? Вообще хочу просто уведомлять пользователя о том, что какой-то объект имеет не тот тип, который ожидает программа.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 12:41
Ответы с готовыми решениями:

Что не так в коде(блоки try catch)
using System; using System.Collections.Generic; using System.Linq; using...

Редактор блок-схем, как сделать так, чтобы линии соединяющие блоки сохранялись при перемещении блоков
Здравствуйте! Сел за написание курсовой работы и сильно заинтересовал один...

Обертка над INotifyPropertyChanged
Я пытаюсь написать (если это возможно) обертку над INotifyPropertyChanged....

Обертка над массивом double[]
Здравствуйте, подскажите пожалуйста с решением задания. Само задание: Нужно...

Обертка над libipriv.dll
Здравствуйте уважаемые форумчане. Помогите пожалуйста. Использую библиотеку...

13
MaxValue
30 / 28 / 6
Регистрация: 16.08.2012
Сообщений: 126
13.08.2014, 13:17 2
проверить тип "someobject"
0
nedel
616 / 605 / 358
Регистрация: 09.04.2014
Сообщений: 1,441
Завершенные тесты: 1
13.08.2014, 13:18 3
Цитата Сообщение от Kukurudza Посмотреть сообщение
Как сделать так, чтобы блоки try/catch не дублировались?
Заключите весь код в один блок try/catch
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
for (...) {
            try {
    if (...) {
        if (...) {
            double d;
                d = (double)someobject;
            делаем что-то еще, если исключение не брошено, используя d
        } else {
            int d;
                d = (int)someobject;
            делаем что-то еще, если исключение не брошено, используя d
        }
    } else {
        if (...) {
            bool d;
                d = (bool)someobject;
            делаем что-то еще, если исключение не брошено, используя d
        } else {
            string d;
 
                d = (string)someobject;
            делаем что-то еще, если исключение не брошено, используя d
        }
    }
            } catch (System.InvalidCastException) {
                что-то пишем в лог
            }
 
}
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
13.08.2014, 13:22  [ТС] 4
nedel, можно, но в
C#
1
2
3
catch (System.InvalidCastException) {
    что-то пишем в лог
}
я хочу передавать какие-то данные. например, локальную переменную d. а она везде имеет разный тип
0
nedel
616 / 605 / 358
Регистрация: 09.04.2014
Сообщений: 1,441
Завершенные тесты: 1
13.08.2014, 13:32 5
Цитата Сообщение от Kukurudza Посмотреть сообщение
например, локальную переменную d. а она везде имеет разный тип
ведь у вас есть someobject, у которого есть ToString() - этого обычно хватает для лога
0
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
13.08.2014, 13:36 6
В этом коде применять исключения вообще не нужно
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
13.08.2014, 13:40  [ТС] 7
как то так:
C#
1
2
3
4
5
6
7
double d;
if (Object.ReferenceEquals(d.GetType(), someobject.GetType())) {
    d = (double)someobject;
    делаем что-то еще, используя d
} else {
    что-то пишем в лог
}
?
0
nedel
616 / 605 / 358
Регистрация: 09.04.2014
Сообщений: 1,441
Завершенные тесты: 1
13.08.2014, 13:56 8
нет
C#
1
2
3
4
5
6
7
double d;
if (someobject is double) {
    d = (double)someobject;
    делаем что-то еще, используя d
} else {
    что-то пишем в лог
}
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
13.08.2014, 14:07  [ТС] 9
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
StringBuilder sb = new StringBuilder();
 
void log(Type t) {
    sb.Append("Strange type. Expected type = ");
    sb.Append(t);
}
 
void f() {
    double d;
    if (someobject is double) {
        d = (double)someobject;
        делаем что-то еще, используя d
    } else {
        log(d.GetType());
    }
}
ok?
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
13.08.2014, 14:12 10
C#
1
2
3
4
swith(someobject.GetType().ToString())
{
  case "System.Double": ...
}
а откуда у вас взялся someobject? есть полиморфизм и шаблонные классы-методы. обычно этого достаточно длля подобных случаев.
0
nedel
616 / 605 / 358
Регистрация: 09.04.2014
Сообщений: 1,441
Завершенные тесты: 1
13.08.2014, 14:17 11
log(d.GetType()); - этого вам компилятор не пропустит, напишите log(typeof(decimal));

странный способ писать лог в StringBuilder, обычно пишут либо в файл, либо выводят для пользователя, либо используют System.Diagnostics.Trace
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
13.08.2014, 14:17  [ТС] 12
someobject это вообще JsonObject. у него есть метод GetValue(), который возвращает значение. но настоящий тип этого значения известен только в рантайме. априори я предположительно знаю какой тип должен иметь GetValue() и хочу его сравнить с реальным типом, который есть во время рантайма. если типы совпадают, то все ok используем это значение, если нет, то пропускаем это значение.
0
nedel
616 / 605 / 358
Регистрация: 09.04.2014
Сообщений: 1,441
Завершенные тесты: 1
13.08.2014, 14:17 13
удалено
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
13.08.2014, 14:20  [ТС] 14
nedel, ммм, пропустил однако. 13 студия.
в StringBuilder накапливаются сообщения для всех ошибочных преобразований и потом показываются пользователю в окошке.
0
13.08.2014, 14:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2014, 14:20

Асинхронная обертка над классом
Доброго времени суток! Заранее извиняюсь если не в ту ветку. Суть в...

Блоки try , catch и finally
Доброго времени суток бойцы , решил поделится с вами одним наблюдением , может...

Как сделать так чтобы фон оставался на месте, а прокручивались блоки сайта
Пытаюсь сделать так чтобы фон оставался на месте и не повторялся, а двигались...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru