我有时会遇到需要捕获异常的情况,如果它被抛出但从不对它做任何事情.换句话说,可能会发生异常,但如果发生异常则无关紧要.
我最近阅读了这篇关于类似内容的文章:http://c2.com/cgi/wiki?EmptyCatchClause
这个人谈论的评论如何
// should never occur
Run Code Online (Sandbox Code Playgroud)
是代码气味,不应该出现在代码中.然后他们去解释评论如何
// don't care if it happens
Run Code Online (Sandbox Code Playgroud)
完全不同,我自己遇到这样的情况.例如,在发送电子邮件时,我会执行与此类似的操作:
var addressCollection = new MailAddressCollection();
foreach (string address in addresses)
{
try
{
addressCollection.Add(address);
}
catch (Exception)
{
// Do nothing - if an invalid email occurs continue and try to add the rest
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可能认为这样做是个坏主意,因为您希望返回给用户并解释无法将一条或多条消息发送给收件人.但是,如果它只是一个CC地址怎么办?这不太重要,即使其中一个地址无效(可能只是一个错字),您仍然可能仍然希望发送消息.
所以我使用空挡块是对的还是有一个我不知道的更好的替代方案?
当您从控制器中的操作调用的自己的代码抛出异常时应该如何处理?我看到很多最佳实践的例子,其中根本没有try-catch语句.例如,从存储库访问数据:
public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}
Run Code Online (Sandbox Code Playgroud)
显然,如果调用它是一个无法访问的数据库,并且我们正在使用像Entity Framework这样的ORM,则此代码可能会抛出异常.
但是,我能看到的所有事情都会发生异常,并且会向用户显示一条令人讨厌的错误消息.
我知道HandleError属性,但据我所知,如果发生未处理的异常,它主要用于将您重定向到错误页面.
当然,这段代码可以包装在try-catch中,但不能很好地分离,特别是如果你有更多的逻辑:
public ViewResult Index()
{
if (ValidationCheck())
{
IList<CustomModel> customModels = new List<CustomModel>();
try
{
customModels = _customModelRepository.GetAll();
}
catch (SqlException ex)
{
// Handle exception
}
if (CustomModelsAreValid(customModels))
// Do something
else
// Do something else
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
以前我已经提取出所有可能会将数据库调用之类的异常引入DataProvider类的代码,该类处理错误并返回消息以向用户显示消息.
我想知道处理这个问题的最佳方法是什么?我并不总是希望返回错误页面,因为一些例外不应该这样做.相反,应该以正常视图显示给用户的错误消息.我以前的方法是正确的还是有更好的解决方案?
我正在尝试理解实体框架的基础知识,我对DbContext上的Set <>方法有疑问.我正在使用数据库第一个模型来解决以下问题.
假设我有一个ActivityLog数据库,其中包括我可以用来提取消息(例如NLog消息).我可以编写一些代码来提取所有这样的消息:
using (var entities = new ActivityLogEntities())
foreach (var log in entities.AcitivityLogs)
Console.WriteLine(log.Message);
Run Code Online (Sandbox Code Playgroud)
但是我也可以做到这一点:
using (var entities = new ActivityLogEntities())
foreach (var message in entities.Set<ActivityLog>().Select(entity => entity.Message))
Console.WriteLine(message);
Run Code Online (Sandbox Code Playgroud)
我的问题是这两个陈述有什么区别?什么时候使用一个比另一个更合适?或者这仅仅是个人偏好的问题?
我一直在研究使用 Azure AD 为我正在构建的 API 进行 .NET Core 身份验证的基础知识,并且我一直在尝试查找有关身份验证方案的信息。我知道基于 cookie 和基于令牌的身份验证之间的区别,但在我看来 JwtBearer 和 OpenIdConnect 选项非常相似,因为它们都基于令牌系统工作。
我进行了大量搜索,但找不到任何可以解释两者之间差异的地方,在哪种情况下您会使用一种而不是另一种,甚至是这些方法的作用的定义。我在网上看了很多教程,甚至各种 YouTube 视频,其中大约 60% 使用 AddJwtBearer,其他人使用 AddOpenIdConnect 来指定他们的身份验证方案。有人能解释一下这些是做什么的,有什么区别吗?
我有一个自定义MembershipProvider类,它继承自MembershipProvider,它带有两个参数:
public class CustomMembershipProvider : MembershipProvider
{
private readonly ISecurityRepository _securityRepository;
private readonly IUserRepository _userRepository;
public CustomMembershipProvider(ISecurityRepository securityRepository, IUserRepository userRepository)
{
...
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
...
}
... etc
}
Run Code Online (Sandbox Code Playgroud)
这个配置文件看起来类似于:
<membership defaultProvider="CustomMembershipProvider">
<providers>
<clear />
<add name="CustomMembershipProvider" type="Library.Membership.CustomMembershipProvider" />
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
这在我的Web应用程序中主要用于登录和注销.我正在使用Unity for DI并在我的Boostrapper.cs类中设置必要的类.
但是,当我想创建一个自定义User类并调用Membership.GetUser方法时,我最近遇到了一个问题.当我这样做时,我得到以下异常:
{"No parameterless constructor defined for this object. (C:\\*app path*\\web.config line 43)"}
Run Code Online (Sandbox Code Playgroud)
我的配置文件中的第43行指向我上面发布的自定义成员资格提供程序.我认为在其他地方,应用程序使用Unity来解析这些参数,但是在使用Membership类时却没有.
有什么办法可以告诉应用程序如何解决这些依赖关系,或者如果没有办法在不使用具体实现的情况下将这些依赖关系添加到我的成员资格提供程序中?
编辑1:
这是自定义User类:
public class User : MembershipUser
{
public int UserId { get; …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc dependency-injection asp.net-membership unity-container
我正在尝试为我创建的一个新项目编写单元测试,并且我遇到了一个问题,我无法弄清楚我打算编写的类是如何实际可测试的.下面我简化了我想写的课程,让你了解我想要实现的目标.
所以我有一个XML解析器,它只需从给定的URL访问XML文件,提取我需要的数据并将其作为对象返回.所以我的代码看起来像这样(验证和人口尚未完成,但你明白了):
public UserDetails ParseUserDetails(string request, string username, string password)
{
var response = new XmlDocument();
response.Load(string.Format(request + "?user={0}&password={1}", username, password));
// Validation checks
return new UserDetails { // Populate object with XML nodes };
}
Run Code Online (Sandbox Code Playgroud)
目前我的班级不可测试.我无法模拟加载以抛出WebException以查看我的类如何处理错误,并且在我通过有效的URL之前,当我针对此类运行测试时,它总是会抛出异常.我也无法测试从类中返回的数据,因为我无法模拟XML文档,因为它是从另一个URL加载的.
我可以把它拆分成一个可模拟的对象,从URL中检索XML并将其命名为IXmlDocumentLoader,但后来我遇到了同样的问题,我有这样的类:
public class XmlDocumentLoader : IXmlDocumentLoader
{
public XmlDocument LoadXmlDocument(string request, string username, string password)
{
var response = new XmlDocument();
response.Load(string.Format(request + "?user={0}&password={1}", username, password));
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
这将使ParseUserDetails方法更易于测试,但现在类XmlDocumentLoader是不可测试的.我刚刚把问题转移到其他地方了吗?我的问题是,所有课程都必须是可测试的,还是我误解了单元测试?
我正在尝试使用ECharts绘制一个我已经能够做的简单的甜甜圈图。我注意到默认情况下,如果单击图例,图例将隐藏图表上的数据项。
我希望用户能够选择图例以执行某些操作(触发事件),而我可以使用可用的事件(https://ecomfe.github.io/echarts-doc/public/en/api.html# events.legendselected),但是我想防止在图表上隐藏/显示数据项的默认行为。
在文档中提到了图例上的属性selectedMode(https://ecomfe.github.io/echarts-doc/public/en/option.html#legend.selectedMode),该属性可防止切换该系列,但这也使图例无法完全选择。
我还尝试过为legendselected和legendunselected触发的事件返回false,但没有成功。
有没有人找到停止这种行为的方法?非常感谢您在此问题上的帮助。
这是一个小提琴,其中包含将selectedMode设置为false的内容。删除此标志以查看默认行为:
legend: {
orient: "vertical",
x: "right",
selectedMode: false,
data: data.map(d => d.name)
}
Run Code Online (Sandbox Code Playgroud)
我正在使用第三方 JavaScript 库,我想在 VS Code 中使用调试器进行单步调试。该项目是一个 Vue.js SPA,在我的 package.json 文件中有许多依赖项。我可以在 node_modules 中看到 lib 下有一个 .min.js 文件和一个标准 .js 文件。
当我运行应用程序时,它会加载缩小的文件,但这使得调试变得更加困难。我想改为加载非缩小文件。我似乎找不到任何相关信息,因为我的搜索主要涉及如何缩小 JS 文件并将它们作为依赖项包含在 NPM 中。我希望能够切换到使用源调试文件而不是生产版本。我尝试重命名 .min 文件,看看是否会选择另一个文件,但没有成功。
有没有办法在调试模式下运行应用程序以获取依赖项?或者为 NPM 依赖项指定不同的文件?
在我的一个类中,我调用了一个存储库,该存储库上有一些错误处理.我想重构错误处理代码,因为它是非常重复的,唯一真正改变的是消息.
我的代码目前看起来像这样:
public IList<User> GetUser()
{
try
{
return _repository.GetUsers();
}
catch (WebException ex)
{
ErrorMessages.Add("...");
_logger.ErrorException("...", ex);
}
catch (SoapException ex)
{
ErrorMessages.Add("...");
_logger.ErrorException("...", ex);
}
... etc
}
Run Code Online (Sandbox Code Playgroud)
我可以通过调用另一个获取错误消息值和记录器消息值的方法来替换catch块中的那些行.但是我想我也可以使用Action <>参数执行此操作,但我对使用Func <>和Action <>非常缺乏经验,并且我没有真正看到使用其中一个方法对我有什么好处.
我的问题是什么是重构这个代码的最佳方法,为什么一种方式比另一种方式更有利(根据我上面的例子).
谢谢你的帮助.
我很擅长使用Java,并尝试使用map来集合集合中的集合来尝试获取单个List.但是我似乎无法让这个工作.为了重现这一点,我创造了一个很简单的例子,说明我正在尝试做什么.这是我到目前为止:
ClassA的
import java.util.List;
public class ClassA {
private List<ClassB> listOfClassB;
public ClassA(List<ClassB> listOfClassB) {
this.listOfClassB = listOfClassB;
}
public List<ClassB> getListOfClassB() {
return this.listOfClassB;
}
}
Run Code Online (Sandbox Code Playgroud)
ClassB的
public class ClassB {
private String item;
public ClassB(String item) {
this.item = item;
}
public String getItem() {
return item;
}
}
Run Code Online (Sandbox Code Playgroud)
主要
public class Main {
public static void main(String[] args) {
ClassB firstClass = new ClassB("A");
ClassB secondClass = new ClassB("B");
ClassB thirdClass = new ClassB("C");
ClassB fourthClass = …Run Code Online (Sandbox Code Playgroud) c# ×6
asp.net-mvc ×2
exception ×2
javascript ×2
.net ×1
.net-core ×1
charts ×1
debugging ×1
echarts ×1
java ×1
java-8 ×1
java-stream ×1
jwt ×1
lambda ×1
list ×1
mocking ×1
npm ×1
refactoring ×1
unit-testing ×1