2008-09-23 4 views
41

Я знаю, Google Googling Я могу найти подходящий ответ, но я предпочитаю слушать ваши личные (и, может быть, технические) мнения.
В чем основная причина разницы между Java и C# при метании исключений?
В Java подпись метода, который генерирует исключение, должна использовать ключевое слово «throws», а в C#, которое вы не знаете во время компиляции, если может быть выбрано исключение.Почему исключения отсутствуют в .NET?

ответ

44

Поскольку ответ на проверяемые исключения почти всегда:

try { 
    // exception throwing code 
} catch(Exception e) { 
    // either 
    log.error("Error fooing bar",e); 
    // OR 
    throw new RuntimeException(e); 
} 

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

+4

Но на самом деле, это не должно быть. Множество исключений не являются фатальными. Основная проблема заключается в том, что Checked, вероятно, не должен быть типом исключения по умолчанию, и они злоупотребляются на Java. Но проверенные исключения могут быть полезны. – Herms 2008-09-26 20:11:22

+8

Если программист ленив, как эта ошибка Java? Если программист их использует, то это плохой дизайн API, и опять же, как эта ошибка Java? Изгиб языка назад, чтобы успокоить лень или глупость, никогда не является хорошей идеей в моей книге. Я, например, считаю, что проверенные исключения являются полезным ИНСТРУМЕНТОМ, не более того, не что иное, как – mcjabberz 2009-09-28 16:46:06

+23

@mcjabberz, JDK излишним их. Это ошибка Java. – noah 2009-09-30 17:49:50

13

Основная философия дизайна C# заключается в том, что на самом деле отлавливание исключений редко бывает полезным, тогда как очистка ресурсов в исключительных ситуациях весьма важна. Я считаю справедливым сказать, что using (шаблон IDisposable) является их ответом на проверенные исключения. Подробнее см. В [1].

  1. http://www.artima.com/intv/handcuffs.html
1

Я перешел с Java на C# из-за смены работы. Сначала меня немного беспокоило разницу, но на практике это не изменило ситуацию.

Возможно, это потому, что я пришел из C++, у которого есть объявление об исключении, но оно обычно не используется. Я пишу каждую строку кода, как если бы ее можно было выбрасывать - всегда используйте, используя «Одноразовый», и думайте об очистке, которую я должен сделать в конце.

В ретроспективе распространение объявления бросков в Java на самом деле ничего не принесло мне.

Мне хотелось бы сказать, что функция определенно никогда не бросает - я думаю, что это было бы более полезно.

+2

Существует ограниченная степень, в которой функция может сказать это ** определенно ** никогда не бросает - например, ситуация с низкой памятью может привести к исключению OutOfMemoryException почти где угодно, например. Может быть, функция может требовать, чтобы она никогда не бросала «преднамеренно», но насколько это было бы полезно? Что вы могли бы с пользой сделать с таким требованием? – AakashM 2009-06-12 15:26:04

1

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

10

К тому времени .NET был разработан, Java проверил исключения в течение достаточно долгого времени, и эта функция рассматривалась разработчиками Java в лучшем случае, как controversialcontroversial. Таким образом, разработчики .NET chose не должны включать его на языке C#.

+0

выглядит смешно, но я думаю, что это правда и является одной из главных причин того, что команда языка дизайна C# никогда не расскажет нам :) – hqt 2012-05-18 17:38:32

4

Интересно, что ребята из Microsoft Research добавили отмеченные исключения в Spec#, их надмножество C#.

1

Я иногда пропускаю проверенные исключения в C# /. NET.

Я полагаю, кроме Java нет другой заметной платформы. Возможно, ребята .NET просто пошли с потоком ...

92

В статье The Trouble with Checked Exceptions и Хейлсберг (в конструкторе C# языка) собственный голос, есть три основные причины для C#, не поддерживающие проверяемых исключений, как они будут найдены и проверены в Java:

  • Нейтральный на проверяемые исключения

    «C# в основном молчит по проверяемому вопросу исключений. После того, как лучше решения известно, и поверьте мне, мы продолжать думать об этом, мы можем пойти назад и фактически положить что-то в месте.»

  • Versioning с проверяемыми исключениями

    «Добавление нового исключения в броски в новой версии прерывает клиент . Это похоже на добавление метода к интерфейсу . После публикации интерфейса , это для всех практических целей неизменно, ...»

    «Это смешно, как люди думают, что важной вещь исключений обращения с ними. Это не относится к исключениям. В хорошо написанном приложении есть соотношение от десяти до одного, на мой взгляд, попробуйте, наконец, попробовать поймать. Или в C#, using заявления, которые как попытаться наконец-то.»

  • Масштабируемость проверяемых исключений

    «В малом, проверил исключения очень заманчиво ... Беда начинается, когда вы начинаете строить большие системы , где вы разговариваете с четырьмя или пятью различными подсистемами. Каждая подсистема выбрасывает от четырех до десяти исключений . Теперь, каждый раз, когда вы поднимаетесь на на лестницу агрегирования, у вас есть эта экспоненциальная иерархия ниже вас исключений, с которыми вам приходится иметь дело. Вам нужно объявить 40 исключениями, которые вы можете бросить. ... Это просто воздушные шары из-под контроля.»

В своей статье„Why doesn't C# have exception specifications?“, Anson Horton (Visual C# Программа Manager) также перечисляет следующие причины (см статью подробности о каждой точке):

  • управления версиями
  • Производительность и качество кода
  • Непривлекательность при наличии автогражданской квалификации между проверено и unchecked исключений
  • Сложность определения правильных исключений для интерфейсов.

Интересно отметить, что C# делает, тем не менее, поддерживает документацию исключений брошенных данный метода с помощью <exception> тега и компилятор даже берет на себя труд проверить, что тип ссылки исключения действительно существует. Тем не менее, на сайтах вызовов не используется проверка или использование метода.

Вы также можете посмотреть в Exception Hunter, который является Commerical инструмента, с помощью Red Gate Software, который использует статический анализ, чтобы определить и сообщить исключения, метод и которые потенциально могут пойти неперехваченным:

Exception Hunter это новый анализ инструмент, который находит и сообщает набор возможных исключений, ваши функции может быть брошен - прежде чем вы даже отправляете. С его помощью вы можете найти необработанные исключениями легко и быстро, вплоть до строка кода, которая бросает исключений. После того, как у вас есть результаты, вы можете решить, для каких исключений необходимо использовать (с некоторым исключением код обработки), прежде чем вы отпустите приложение в дикую природу.

Наконец, Bruce Eckel, автор Thinking in Java, есть статья под названием «Does Java need Checked Exceptions?», что может быть стоит читать вверх, а потому вопрос о том, почему проверяемые исключения не существует в C# обычно укореняется в сравнениях для Java ,

8

По существу, должно ли быть обработано исключение или нет, является свойство вызывающего , а не функции.

Например, в некоторых программах нет значения при обработке IOException (рассмотрите специальные утилиты командной строки для выполнения хруста данных, они никогда не будут использоваться «пользователем», они являются специализированными инструментами используемые специалистами). В некоторых программах существует ценность в обработке IOException в точке «рядом» с вызовом (возможно, если вы получите FNFE для своего конфигурационного файла, вы вернетесь к некоторым значениям по умолчанию или посмотрите в другом месте или что-то в этом природа). В других программах вы хотите, чтобы он пузырился задолго до того, как он будет обработан (например, вы можете отказаться от него до тех пор, пока он не достигнет пользовательского интерфейса, после чего он должен предупредить пользователя о том, что что-то пошло не так.

из этих случаев зависит от приложения , а не библиотеки .И все же, с проверенными исключениями, это библиотека, которая принимает решение. Библиотека IO Java принимает решение о том, что она будет использовать проверенные исключения (которые настоятельно рекомендуют использовать эту локальную для вызова), когда в некоторых программах лучшая стратегия может быть нелокальной обработкой или вообще не обрабатывать.

Это показывает реальную ошибку с проверенными исключениями на практике, и это гораздо более фундаментально, чем поверхностный (хотя и важный) недостаток, который слишком много людей напишет глупые обработчики исключений, чтобы заставить компилятор заткнуться. Проблема, которую я описываю, является проблемой, даже когда опытные, добросовестные разработчики пишут программу.

2

сам Андерс отвечает на этот вопрос this episode из программного обеспечения радиотехника подкаста

Смежные вопросы