Результаты поиска
Необработанный обработчик исключений в .NET 1.1
Я поддерживаю приложение .NET 1.1, и одна из моих задач-убедиться, что пользователь не видит никаких недружественных уведомлений об ошибках.
Я добавил обработчики к Application.ThreadException и AppDomain.CurrentDomain.UnhandledException, которые действительно вызываются. Моя проблема заключается в том, что стандартный диалог ошибки CLR все еще отображается (до вызова обработчика исключений).
Джефф рассказывает об этой проблеме в своем блоге здесь и здесь . Но нет никакого решения. Итак, каков стандартный способ в .NET 1.1 обрабатывать необнаруженные исключения и отображать дружественное диалоговое окно?
Ответ Джеффа был отмечен как правильный ответ, потому что ссылка, которую он предоставил, содержит самую полную информацию о том, как сделать то, что требуется.
Как исправить ошибку "Unprocessed view path found" с плагином ExceptionNotifier в rails 2.1?
После обновления веб-сайта rails 1.2 до 2.1 плагин ExceptionNotifier больше не работает, жалуясь на эту ошибку:
ActionView::TemplateFinder::InvalidViewPath: необработанный путь представления найдено: "/path/to/appname/vendor/plugins/exception_notification/lib/../views". Задайте пути просмотра с помощью #append_view_path, #prepend_view_path, или #view_paths=.
Что вызывает это и как я могу это исправить?
Обеспечение того, чтобы исключения всегда перехватывались
Исключения в C++ не должны быть пойманы (без ошибок времени компиляции) вызывающей функцией. Таким образом, это зависит от решения разработчика, следует ли ловить их с помощью try/catch (в отличие от Java).
Есть ли способ гарантировать, что брошенные исключения всегда перехватываются с помощью try/catch вызывающей функцией?
Уменьшение количества повторяющихся кодов обработки ошибок в C#?
Я никогда не был полностью доволен тем, как работает обработка исключений, есть много исключений и try / catch приносит в таблицу (размотка стека и т. д.), но, похоже, в этом процессе нарушается большая часть модели OO.
В любом случае, вот в чем проблема:
Допустим, у вас есть какой-то класс, который обертывает или включает сетевые операции с файлом IO (например, чтение и запись в какой-то файл по какому-то конкретному пути UNC). По разным причинам вы не хотите, чтобы эти операции IO завершились неудачей, поэтому, если вы обнаружите, что они завершились неудачей, вы повторяете их и продолжаете повторять, пока они не завершатся успешно или вы не достигнете тайм-аута. У меня уже есть удобный класс RetryTimer, который я могу создать и использовать, чтобы перевести текущий поток в спящий режим между повторными попытками и определить, когда истек период ожидания и т. д.
Проблема в том, что у вас есть куча операций IO в нескольких методах этого класса, и вам нужно обернуть каждую из них в логику try-catch / retry.
Вот пример фрагмента кода:
RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
try
{
// do some file IO which may succeed or fail
success = true;
}
catch (IOException e)
{
if (fileIORetryTimer.HasExceededRetryTimeout)
{
throw e;
}
fileIORetryTimer.SleepUntilNextRetry();
}
}
Итак, как избежать дублирования большей части этого кода для каждой операции file IO в классе? Мое решение состояло в использовании анонимных блоков делегатов и единственного метода в классе, который выполнял переданный ему блок делегатов. Это позволило мне делать подобные вещи другими методами:
this.RetryFileIO( delegate()
{
// some code block
} );
Мне это несколько нравится, но оставляет желать лучшего. Я бы хотел услышать, как другие люди решают подобные проблемы.
Почему я не могу использовать блок try вокруг моего вызова super()?
Итак, в Java первая строка вашего конструктора HAS должна быть вызовом super... будь то неявный вызов super() или явный вызов другого конструктора. Вот что я хочу знать: почему я не могу поставить пробный блок вокруг этого?
Мой конкретный случай заключается в том, что у меня есть макет класса для теста. Конструктора по умолчанию нет, но я хочу, чтобы он упрощал чтение тестов. Я также хочу обернуть исключения, вызванные из конструктора, в RuntimeException.
Итак, то, что я хочу сделать, это эффективно:
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
Но Java жалуется, что супер-это не первое утверждение.
Мой обходной путь:
public class MyClassMock extends MyClass {
public static MyClassMock construct() {
try {
return new MyClassMock();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public MyClassMock() throws Exception {
super(0);
}
// Mocked methods
}
Является ли это лучшим обходным путем? Почему Java не позволяет мне сделать первое?
Моя лучшая догадка относительно "why" заключается в том, что Java не хочет, чтобы я имел сконструированный объект в потенциально противоречивом состоянии... однако, делая глумление, я не забочусь об этом. Кажется, я должен быть в состоянии сделать это выше... или, по крайней мере, я знаю, что вышесказанное безопасно для моего случая... или кажется, что так и должно быть в любом случае.
Я переопределяю все методы, которые я использую из тестируемого класса, поэтому нет никакого риска, что я использую неинициализированные переменные.
Почему плохой пароль вызывает "заполнение недопустимо и не может быть удалено"?
Мне нужно было какое-то простое строковое шифрование, поэтому я написал следующий код (с большим количеством "inspiration" отсюда ):
// create and initialize a crypto algorithm
private static SymmetricAlgorithm getAlgorithm(string password) {
SymmetricAlgorithm algorithm = Rijndael.Create();
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(
password, new byte[] {
0x53,0x6f,0x64,0x69,0x75,0x6d,0x20, // salty goodness
0x43,0x68,0x6c,0x6f,0x72,0x69,0x64,0x65
}
);
algorithm.Padding = PaddingMode.ISO10126;
algorithm.Key = rdb.GetBytes(32);
algorithm.IV = rdb.GetBytes(16);
return algorithm;
}
/*
* encryptString
* provides simple encryption of a string, with a given password
*/
public static string encryptString(string clearText, string password) {
SymmetricAlgorithm algorithm = getAlgorithm(password);
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/*
* decryptString
* provides simple decryption of a string, with a given password
*/
public static string decryptString(string cipherText, string password) {
SymmetricAlgorithm algorithm = getAlgorithm(password);
byte[] cipherBytes = Convert.FromBase64String(cipherText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
return System.Text.Encoding.Unicode.GetString(ms.ToArray());
}
Код, похоже, работает нормально, за исключением того, что при расшифровке данных с неверным ключом я получаю CryptographicException - "Padding is invalid and cannot be removed" - на строке cs.Close() в decryptString.
пример кода:
string password1 = "password";
string password2 = "letmein";
string startClearText = "The quick brown fox jumps over the lazy dog";
string cipherText = encryptString(startClearText, password1);
string endClearText = decryptString(cipherText, password2); // exception thrown
Мой вопрос в том, можно ли этого ожидать? Я бы подумал, что расшифровка с неверным паролем просто приведет к бессмысленному выходу, а не к исключению.
A ThreadStateException возникает при попытке перезапустить поток
Время от времени я получаю System.Threading.ThreadStateException при попытке перезапустить поток. Рассматриваемый код выглядит следующим образом:
// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{
Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{
this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{
this.mThread.Start(60000);
}
else
{
this.mThread.Start(0);
}
Итак, два вопроса - Является ли это правильным способом делать вещи, и есть ли способ предотвратить возникновение ошибки?
A ThreadStateException возникает при попытке перезапустить поток
Время от времени я получаю System.Threading.ThreadStateException при попытке перезапустить поток. Рассматриваемый код выглядит следующим образом:
// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{
Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{
this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{
this.mThread.Start(60000);
}
else
{
this.mThread.Start(0);
}
Итак, два вопроса - Является ли это правильным способом делать вещи, и есть ли способ предотвратить возникновение ошибки?
Запретить проглатывание исключений элементом управления WebBrowser
Я использую System.Windows.Forms.WebBrowser, чтобы сделать представление a-la начальной страницы Visual Studio. Однако, похоже, что элемент управления ловит и обрабатывает все исключения, молча погружая их! Не нужно говорить, что это очень неудачное поведение.
void webBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
// WebBrowser.Navigating event handler
throw new Exception("OMG!");
}
Приведенный выше код отменит навигацию и проглотит исключение.
void webBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
// WebBrowser.Navigating event handler
try
{
e.Cancel = true;
if (actions.ContainsKey(e.Url.ToString()))
{
actions[e.Url.ToString()].Invoke(e.Url, webBrowser.Document);
}
}
catch (Exception exception)
{
MessageBox.Show(exception.ToString());
}
}
Итак, то, что я делаю (выше), - это поймать все исключения и открыть окно, это лучше, чем молча терпеть неудачу, но все же явно далек от идеала. Я бы хотел, чтобы он перенаправлял исключение через обычный путь сбоя приложения, чтобы оно в конечном итоге становилось необработанным или обрабатывалось приложением из корня.
Есть ли способ сказать элементу управления WebBrowser , чтобы остановить потопление исключений и просто переслать их естественным и ожидаемым способом? Или есть какой-то хакерский способ бросить исключение через родные границы?
Как я могу перенаправить пользователя на настраиваемую страницу 404 в ASP.NET MVC вместо того, чтобы бросать исключение?
Я хочу иметь возможность захватить исключение, которое возникает, когда пользователь запрашивает несуществующий контроллер, и перенаправить его на страницу 404. Как я могу это сделать?
Например, пользователь запрашивает http://www.nosite.com/paeges/1 ( должно быть /pages/). Как мне сделать так, чтобы они были перенаправлены на экран 404, а не на экран исключений?
Запретить проглатывание исключений элементом управления WebBrowser
Я использую System.Windows.Forms.WebBrowser, чтобы сделать представление a-la начальной страницы Visual Studio. Однако, похоже, что элемент управления ловит и обрабатывает все исключения, молча погружая их! Не нужно говорить, что это очень неудачное поведение.
void webBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
// WebBrowser.Navigating event handler
throw new Exception("OMG!");
}
Приведенный выше код отменит навигацию и проглотит исключение.
void webBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
// WebBrowser.Navigating event handler
try
{
e.Cancel = true;
if (actions.ContainsKey(e.Url.ToString()))
{
actions[e.Url.ToString()].Invoke(e.Url, webBrowser.Document);
}
}
catch (Exception exception)
{
MessageBox.Show(exception.ToString());
}
}
Итак, то, что я делаю (выше), - это поймать все исключения и открыть окно, это лучше, чем молча терпеть неудачу, но все же явно далек от идеала. Я бы хотел, чтобы он перенаправлял исключение через обычный путь сбоя приложения, чтобы оно в конечном итоге становилось необработанным или обрабатывалось приложением из корня.
Есть ли способ сказать элементу управления WebBrowser , чтобы остановить потопление исключений и просто переслать их естественным и ожидаемым способом? Или есть какой-то хакерский способ бросить исключение через родные границы?
Как я могу регистрировать необнаруженные исключения в PHP?
Я выяснил, как преобразовать ошибки в исключения, и я хорошо отображаю их, если они не пойманы, но я не знаю, как их правильно регистрировать. Просто записать их в файл не будет полезно, не так ли? И вы бы рискнули получить доступ к базе данных, когда вы еще не знаете, что вызвало исключение?
Пишете ли вы исключения для конкретных вопросов или общие исключения?
У меня есть код, который дает идентификатор пользователя утилите, которая затем отправляет email этому пользователю.
emailUtil.sendEmail(userId, "foo");
public void sendEmail(String userId, String message) throws MailException {
/* ... logic that could throw a MailException */
}
MailException может быть брошен по ряду причин, проблем с адресом email, проблем с шаблоном почты и т.д.
Мой вопрос заключается в следующем: вы создаете новый тип исключения для каждого из этих исключений, а затем обрабатываете их по отдельности или создаете один MailException, а затем сохраняете что-то в исключении (что-то машиночитаемое, а не текст описания), что позволяет нам делать разные вещи на основе того, что на самом деле произошло.
Edit: как уточнение, исключения не предназначены для журналов, а что-нет, это относится к тому, как код реагирует на них. Чтобы продолжить работу с примером mail, предположим, что когда мы отправляем почту, она может потерпеть неудачу, потому что у вас нет адреса email, или потому что у вас нет действительного адреса email, или она может потерпеть неудачу.. и т.д.
Мой код хотел бы реагировать по-разному на каждую из этих проблем (в основном путем изменения сообщения, возвращенного клиенту, но и фактической логики).
Было бы лучше иметь реализацию исключения для каждой из этих проблем или одно зонтичное исключение, которое имело бы что-то внутреннее (например, перечисление), что позволило бы коду различать, какая проблема была.
Как вы передаете сообщения/ошибки уровня обслуживания на более высокие уровни с помощью MVP?
В настоящее время я пишу приложение ASP.Net от UI вниз. Я внедряю архитектуру MVP, потому что я устал от Winforms и хотел чего-то, что имело лучшее разделение проблем.
Таким образом, с MVP презентатор обрабатывает события, вызванные представлением. Вот некоторый код, который у меня есть, чтобы иметь дело с созданием пользователей:
public class CreateMemberPresenter
{
private ICreateMemberView view;
private IMemberTasks tasks;
public CreateMemberPresenter(ICreateMemberView view)
: this(view, new StubMemberTasks())
{
}
public CreateMemberPresenter(ICreateMemberView view, IMemberTasks tasks)
{
this.view = view;
this.tasks = tasks;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(ICreateMemberView view)
{
view.CreateMember += delegate { CreateMember(); };
}
private void CreateMember()
{
if (!view.IsValid)
return;
try
{
int newUserId;
tasks.CreateMember(view.NewMember, out newUserId);
view.NewUserCode = newUserId;
view.Notify(new NotificationDTO() { Type = NotificationType.Success });
}
catch(Exception e)
{
this.LogA().Message(string.Format("Error Creating User: {0}", e.Message));
view.Notify(new NotificationDTO() { Type = NotificationType.Failure, Message = "There was an error creating a new member" });
}
}
}
У меня есть моя основная проверка формы, выполненная с использованием встроенных элементов управления проверкой .Net, но теперь мне нужно проверить, что данные достаточно удовлетворяют критериям для уровня сервиса.
Допустим, могут отображаться следующие сообщения уровня сервиса:
- Учетная запись электронной почты уже существует (сбой)
- Ссылка на введенного пользователя не существует (сбой)
- Длина пароля превышает допустимую длину хранилища данных (сбой)
- Участник создан успешно (success)
Предположим также, что на уровне сервиса будет больше правил, которые UI не может предвидеть.
В настоящее время у меня есть уровень сервиса, который бросает исключение, если все пошло не так, как планировалось. Это достаточная стратегия? Этот код пахнет для вас, ребята? Если бы я написал такой уровень сервиса, вы были бы раздражены необходимостью писать докладчиков, которые используют его таким образом? Коды возврата кажутся слишком старой школой, и bool просто недостаточно информативен.
Редактировать не по OP: слияние в последующих комментариях, которые были опубликованы в качестве ответов OP
Cheekysoft, мне нравится концепция a ServiceLayerException. У меня уже есть глобальный модуль исключений для исключений, которые я не ожидаю. Считаете ли вы, что все эти пользовательские исключения утомительны? Я думал, что ловить базовый класс исключений было немного вонючим, но не был точно уверен, как продвигаться оттуда.
tgmdbm, мне нравится умное использование выражения lambda там!
Спасибо Cheekysoft за последующие действия. Поэтому я предполагаю, что это будет стратегия, если вы не возражаете, чтобы пользователь отображал отдельную страницу (Я в первую очередь веб-разработчик), если исключение не обрабатывается.
Однако, если я хочу вернуть сообщение об ошибке в том же представлении, где пользователь представил данные, вызвавшие ошибку, мне придется поймать исключение в Презентаторе?
Вот как выглядит CreateUserView, когда ведущий обработал ServiceLayerException:
Для такого рода ошибок, это хорошо, чтобы сообщить об этом в том же представлении.
В любом случае, я думаю, что сейчас мы выходим за рамки моего первоначального вопроса. Я поиграю с тем, что вы опубликовали, и если мне понадобится дополнительная информация, я отправлю новый вопрос.
Неужели так уж плохо поймать общее исключение?
Анализируя некоторый устаревший код с FXCop, мне пришло в голову, действительно ли так плохо поймать общую ошибку исключения в блоке try или вы должны искать конкретное исключение. Мысли на открытке, пожалуйста.
Рекомендации по отлову и повторному выбрасыванию исключений .NET
Какие рекомендации следует учитывать при перехвате исключений и повторном их отбрасывании? Я хочу убедиться, что InnerException объекта Exception и стек trace сохранены. Есть ли разница между следующими блоками кода в том, как они обрабатывают это?
try
{
//some code
}
catch (Exception ex)
{
throw ex;
}
Против:
try
{
//some code
}
catch
{
throw;
}
Настроить сокет Java на fail-fast при отключении?
У меня есть порт прослушивания на моем сервере, к которому я подключаюсь с помощью класса Java и интерфейса Socket , i.e.
Socket mySocket = new Socket(host,port);
Затем я хватаю OutputStream, украшаю PrintWriter в режиме автозапуска, и я смеюсь - за исключением того, что порт прослушивания закрывается. Тогда я получаю
tcp4 0 0 *.9999 *.* LISTEN
tcp 0 0 127.0.0.1.45737 127.0.0.1.9999 CLOSE_WAIT
и я не могу обнаружить проблему в программе - я попытался использовать метод isConnected() на сокете, но он, похоже, не знает, что соединение закрыто.
Я хочу знать о проблеме в следующий раз, когда я попытаюсь написать в сокет, чтобы я мог попытаться снова подключиться и сообщить о проблеме.
Какие-нибудь советы, пожалуйста?
Спасибо всем
Выгодно ли вообще использовать 'goto' в языке, поддерживающем циклы и функции? Если да, то почему?
У меня уже давно сложилось впечатление, что goto никогда не следует использовать, если это возможно. Просматривая libavcodec (который написан в C) на днях, я заметил, что он используется многократно. Выгодно ли вообще использовать goto в языке, поддерживающем циклы и функции? Если да, то почему?
Обработка исключений: контракт против исключительного подхода
Я знаю два подхода к обработке исключений, давайте посмотрим на них.
Контрактный подход.
Когда метод не делает то, что он говорит, что он будет делать в заголовке метода, он будет вызывать исключение. Таким образом, метод "promises", что он будет выполнять операцию, и если он не работает по какой-то причине, он будет выдавать исключение.
Исключительный подход.
Только бросать исключения, когда что-то действительно странное происходит. Вы не должны использовать исключения, когда вы можете разрешить ситуацию с обычным потоком управления (если операторы). Вы не используете исключения для потока управления, как в контрактном подходе.
Позволяет использовать оба подхода в разных случаях:
У нас есть класс Customer, который имеет метод под названием OrderProduct.
контрактный подход:
class Customer
{
public void OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
throw new NoCreditException("Not enough credit!");
// do stuff
}
}
исключительный подход:
class Customer
{
public bool OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
return false;
// do stuff
return true;
}
}
if !(customer.OrderProduct(product))
Console.WriteLine("Not enough credit!");
else
// go on with your life
Здесь я предпочитаю исключительный подход, так как это не является действительно исключительным, что у клиента нет денег, если он не выиграл в лотерею.
Но вот ситуация, в которой я ошибаюсь в стиле контракта.
Исключительный:
class CarController
{
// returns null if car creation failed.
public Car CreateCar(string model)
{
// something went wrong, wrong model
return null;
}
}
Когда я вызываю метод с именем CreateCar, я чертовски хорошо ожидаю экземпляр Car вместо какого-то паршивого указателя null, который может разрушить мой рабочий код через дюжину строк. Поэтому я предпочитаю контракт этому:
class CarController
{
public Car CreateCar(string model)
{
// something went wrong, wrong model
throw new CarModelNotKnownException("Model unkown");
return new Car();
}
}
Какой стиль вы используете? Как вы думаете, каков наилучший общий подход к исключениям?
java.lang.IllegalArgumentException: недопустимый в сопоставлении сервлетов
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>workflow.WDispatcher</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*NEXTEVENT*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>workflow.WDispatcher</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*NEXTEVENT*</url-pattern>
</servlet-mapping>
Выше приведен фрагмент из Tomcat web.xml . Паттерн URL *NEXTEVENT* при запуске выбрасывает
java.lang.IllegalArgumentException: недопустимый <url-pattern> в сопоставлении сервлетов
Мы будем очень признательны, если кто-то сможет намекнуть на ошибку.
415   2   04:15, 13th August, 2020
Каково общее правило больших пальцев для создания исключения в Java?
Я был в обеих ситуациях:
- Создание слишком большого количества пользовательских исключений
- Использование слишком большого количества общих классов исключений
В обоих случаях проект стартовал OK, но вскоре стал накладными расходами на обслуживание (и рефактор).
Итак, какова наилучшая практика создания собственных классов исключений?
Когда выбрать проверенные и непроверенные исключения
В Java (или любом другом языке с проверяемыми исключениями), создавая свой собственный класс исключений, как вы решаете, следует ли его проверять или нет?
Мой инстинкт говорит, что проверенное исключение будет вызвано в тех случаях, когда вызывающий может быть в состоянии восстановить каким-то продуктивным способом, где как непроверенное исключение будет больше для неустранимых случаев, но мне было бы интересно узнать мысли другого.
Инструмент анализа исключений для C++
Я искал инструмент для извлечения информации об исключениях из программы C++. Самая разыскиваемая функция, которую я ищу: я хочу знать все исключения, которые могут быть брошены из функции (которая будет включать в себя всю функцию, которая вызывается из этой функции рекурсивно).
Я всегда думал, что документирование ошибок и исключений, в частности, очень сложно (и требует много усилий, чтобы идти в ногу со временем). Но если есть какой-то способ автоматизировать это, это было бы очень полезно.
Инструмент для windows и Visual Studio был бы предпочтительным, но не необходимым,я всегда мог бы обойти это.
Почему трассировки стека исключений всегда указывают на последнюю строку метода?
У меня проблема с установкой Visual Studio. Когда я получаю исключение, у меня всегда есть неправильные номера строк в стеке trace. В моей кодовой базе всегда есть точка до последней строки каждого метода. В то же время это OK, когда я отслеживаю программы с отладчиком. Что случилось с PDBs?
Нет, я не повторяю исключение для каждого метода.
В каждой строке стека trace у меня есть последняя строка соответствующего метода, в то время как исключение было брошено оператором в середине.
Windows Vista: не удается загрузить DLL 'x.dll': недопустимый доступ к памяти. (DllNotFoundException)
Сегодня днем я тестировал на коробке клиента, которая имеет Windows Vista (у него был дом, но я тестирую на бизнес-издании с теми же результатами).
Мы используем .DLL, который получает аппаратное обеспечение ID компьютера. Его использование очень просто, и образец программы, которую я создал, работает. Dll - это от AzSdk . На самом деле, это прекрасно работает под Windows XP. Однако, по какой-то странной причине, внутри нашего проекта (намного больше) мы получаем это исключение:
Exception Type: System.DllNotFoundException
Exception Message: Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID
Я не знаю, что может быть причиной проблемы, так как у меня есть полный контроль над папкой. Проект представляет собой приложение форм c#.net Windows, и все работает нормально, за исключением вызова внешней библиотеки.
Я объявляю его следующим образом: (Примечание: это не библиотека COM, и ее не нужно регистрировать).
[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
bool NIC, bool CPU, bool BIOS, string sRegistrationCode);
И тогда вызывающий код достаточно прост:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = GetHardwareID(cb_HDD.Checked,
cb_NIC.Checked,
cb_CPU.Checked,
cb_BIOS.Checked,
"*Registration Code*");
}
Когда вы создаете пример приложения, он работает, но внутри моего проекта он не работает. Under XP работает нормально. Есть ли идеи о том, что я должен сделать в Vista, чтобы сделать эту работу? Как я уже сказал, папка и ее подпапки имеют полный контроль над "Everybody".
UPDATE: у меня не установлена Vista SP 1.
UPDATE 2: я установил Vista SP1 и теперь, когда UAC отключен, даже простой пример не работает!!! : (Чертова Виста.
прокидывать exception в блоках try-catch JAVA
я новичок. дали первую таску, одну часть выполнила, на второй встряла. подскажите пожалуйста что конкретно делать тут
"...в сервисных классах кафки нужно прокидывать exception в блоках try-catch, где вызывается log.error(). Нужно будет написать новые эксепшены нашего сервиса и прокидывать их"
мои сервисы
@Slf4j
@Component
@RequiredArgsConstructor
public class KafkaListenersService {
private final KafkaSenderService kafkaSender;
@Value(value = "${kafka-topics.platform-direction-create}")
private String platformDirectionCreate;
@Value(value = "${kafka-topics.platform-direction-update}")
private String platformDirectionUpdate;
@Value(value = "${kafka-topics.platform-direction-delete}")
private String platformDirectionDelete;
private final ObjectMapper objectMapper;
@KafkaListener(topics = "${kafka-topics.adapter-direction-create}")
public void listenerAdapterDirectionCreate(ConsumerRecord<String, JsonNode> myRecord){
log.info("Get message in topic adapter-direction-create, key {} value {}", myRecord.key(), myRecord.value());
DirectionRequest directionRequest = null;
try {
directionRequest = objectMapper.treeToValue(myRecord.value(), DirectionRequest.class);
} catch (JsonProcessingException e) {
log.error("Error reading message: {}", e.getMessage());
}
log.info("Created request to create direction: " + directionRequest.getName());
kafkaSender.sendMessage(platformDirectionCreate, "Create direction", myRecord.value());
}
@KafkaListener(topics = "${kafka-topics.adapter-direction-update}")
public void listenerAdapterDirectionUpdate(ConsumerRecord<String, JsonNode> myRecord){
log.info("Get message in topic adapter-direction-update, key {} value {}", myRecord.key(), myRecord.value());
DirectionRequest directionRequest = null;
try {
directionRequest = objectMapper.treeToValue(myRecord.value(), DirectionRequest.class);
} catch (JsonProcessingException e) {
log.error("Error reading message: {}", e.getMessage());
}
log.info("Created request to update direction: " + directionRequest.getName());
kafkaSender.sendMessage(platformDirectionUpdate, "Update direction", myRecord.value());
}
@KafkaListener(topics = "${kafka-topics.adapter-direction-delete}")
public void listenerAdapterDirectionDelete(ConsumerRecord<String, JsonNode> myRecord){
log.info("Get message in topic adapter-direction-delete, key {} value {}", myRecord.key(), myRecord.value());
String id = null;
try {
id = objectMapper.treeToValue(myRecord.value(), String.class);
} catch (JsonProcessingException e) {
log.error("Error reading message: {}", e.getMessage());
}
log.info("Created request to delete direction with id: " + id);
kafkaSender.sendMessage(platformDirectionDelete, "Delete direction", myRecord.value());
}
}
----------------------------------------------------------------------------------------------------
@Slf4j
@Service
@RequiredArgsConstructor
public class KafkaSenderService {
private final KafkaTemplate<String, Object> kafkaTemplate;
@Value(value = "${acks-timeout-mseconds}")
private Integer acksTimeoutMseconds;
public void sendMessage(String topic, String key, Object msg) {
try {
kafkaTemplate.send(topic, key, msg).get(acksTimeoutMseconds, TimeUnit.MILLISECONDS);
} catch (ExecutionException | InterruptedException | TimeoutException e) {
log.error("Message timeout may not be connected to Kafka! {} , stackTrace {}", e, Arrays.toString(e.getStackTrace()));
}
log.info("Sending via Kafka to a topic: {} massage: {}", topic, msg);
}
}