当前位置: 首页 > 编程日记 > 正文

Asp.net开发过程中,我们会遇到很多Exception

Asp.net开发过程中,我们会遇到很多Exception,不处理这些Exception的话会出现很难看的页面。
还有一些我们未预料到的Exception,当发生Exception时,我们也必须进行记录具体位置,以便我们修正错误。
asp.net
异常处理的位置大概有以下3个地方
1.
程序的代码段中,这是最直接处理异常的地方。如下
try
{
    n=Convert.ToInt32(info);
}
catch(Exception)
{
}
只是最基本处理异常的地方。

2. ASP.NET的中的Application_Error.Application_Error 事件。对于应用程序中引发的任何未处理异常都会引发此事件。一般我们处理如下
protected void Application_Error(Object sender, EventArgs e)
  {
    Exception exp=Server.GetLastError();
    string strE="
内部错误:"+ exp.InnerException.ToString()+"\r\n堆栈:"+ exp.StackTrace+"\r "+"Message:"+exp.Message+"\r 来源:"+exp.Source;
   
   // 在事件日志中记录异常信息
   Log(strE);
   Server.ClearError();
   Server.Transfer("Error.aspx",false);
  }
这样我们就可以处理Server端出现的错误。我们记录出错的源头。

3. 也可以在页级别或者应用程序级别处理代码错误。Page 基类公开了一个 Page_Error 方法,此方法在页中可以被重写。每当运行时引发未捕获的异常时都调用此方法。
void Page_Error(Object source, EventArgs e) {
    String message = "<font face=verdana color=red>"
        + "<h4>" + Request.Url.ToString() + "</h4>"
        + "<pre><font color='red'>"
        + Server.GetLastError().ToString() + "</pre>"
        + "</font>";

    Response.Write(message);
}

下面我讲述一下怎么在ASP.NET程序里面统一的处理异常,我们以最常见的Session过期为例

我们先写一个Session过期的异常
public class YSessionException:Exception
{
}

我们再定义一个属性
public int SessionValue
{
     get{ if(Session["SessionValue"]==null)
            {
                throw new YSessionException("");
             }
          }
}

下面我们在Page_Error或者Application_Error中处理这个异常
  {
   Exception exp=Server.GetLastError();
                        if(exp is YSessionException)
                        {
                               ..................
                        }
                        Server.ClearError();
   Server.Transfer("Error.aspx",false);
  }

这样就可以为我们程序提供很好的Exception处理界面。

 

前言:异常的处理在项目开发中是很有必要的,异常的处理不仅仅只是try..catch..finally就完事了的。异常处理绝对可以称开发中的重要组成部分。必须正确的面对异常,因为即使是最能干的开发人员,也要面对这个问题 ....


       我们不知道客户是怎么样使用我们开发的软件的,所以我们必须处理这样的情况:如果系统不按照我们的设计时所想的运行,我们改怎么办?

下面我们就来具体的介绍在ASP.NET项目开发中的异常的处理方式,希望看完后,大家可以回答上面的问题。

本篇的话题如下:

应用程序级别异常处理的错误处理
       页面级别异常处理
       方法级别异常处理
       web.config文件异常处理配置
       健康监视(Health Monitoring)
       Enterprise Application Blocks异常处理模块

  一.在应用程序级别的异常处理:
       相信大家对Application对象不陌生,而且在项目中添加过Global.asax文件。确实,ASP.NET在应用程序级别处理异常的代码都是放在Global.asax的Application_Error事件处理下的:

void Application_Error(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif 
{
  
// Code that runs when an unhandled error occurs
 }
 
复制代码

我们可以在上面的事件处理的方法中捕获所有的异常,而且还可以把异常记录到日志文件,并且同时发送Email告诉开发人员出现了什么问题,如下

ContractedBlock.gifExpandedBlockStart.gifCode
Exception error = Server.GetLastError().GetBaseException();
//在事件日志中记录异常
if (!EventLog.SourceExists("ApplicationException"))
ExpandedBlockStart.gifContractedBlock.gif
{
        EventLog.CreateEventSource(
"ApplicationException""Application");
}


EventLog eventLog 
= new EventLog();
eventLog.Log 
= "Application";
eventLog.Source 
= "ApplicationException";
eventLog.WriteEntry(error.ToString(), EventLogEntryType.Error);

//发送Email给开发人员
MailMessage email = new MailMessage("administrator@xiaoyang.com",
"vince.varallo@PoweredByV2.com");
email.Body 
= error.ToString();
email.Subject 
= "An error occurred in the  Application";
SmtpClient smtpClient 
= new SmtpClient("127.0.0.1"25);
smtpClient.Send(email);
Response.Redirect(
"ErrorPage.aspx");




        当然,上面的代码要正确的运行,我们海必须在Global.asax中加入相应的命名空间,而且在发送邮件的时候,上面的"127.0.0.1"要换为我们自己的邮件服务器的地址:

<%@ Import Namespace="System.Diagnostics" %>
 
<%@ Import Namespace="System.Net.Mail" %>
复制代码


 
 
       还有一点要注意的就是,ASP.NET运行时是以ASPNET账户运行的,这个账户的权限是有限的,如果我们想要使得上面的代码可以运行,那么就必须要给ASPNET账户访问注册表的权限。如果你不给权限,那么上面的代码就报错。


       我们赋予ASPNET账户访问在"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog"节点以及字节点的权限。
       下面就讲讲如何配置权限:
       1.打开"运行"菜单
       2.输入"regedit",然后确定
       3.导航到"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog"节点。
       4.右击这个节点,并且选择"权限",此时就会弹出权限配置的窗口。
       5.点击"添加",在弹出的窗口中点击"高级",之后再点击"查找",最后在下面的窗口找到"ASPNET"账户,确定。
       6.最后给予ASPNET账户读的权限就OK了。

上面的代码,如果我们不在最后加了Response.Redirect方法,出错后,用户看到的就是那个很经典的黄颜色的报错的页面。我们也知道,那个经典的报错页面会暴露很多的信息,所以我们常常导航到我们自定义的错误页面。
 
 


       二.页面级的异常处理


       除了在Global.asax中编写处理代码,我们还可以在页面的Page_Error中编写代码:

 public void Page_Error(object sender, EventArgs e)
 {
  
//Insert same code that is in the Application_Error event.
 }
复制代码


 
       如果在该页面中发生了错误,那么页面中的上面的那段代码就会执行,我们可以把之前写在Application_Error事件中的代码全部copy到Page_Error处理方法中。但是,如果这样,那么我们的Application_Error中的代码就不运行了,因为异常已经在之前,也就是Page_Error中被处理了。
 
       三 方法级别的处理
       相信这点大家非常的熟悉了,就是常见的try..catch..finally语句块的运用,这里不赘述。
 
       四 web.config配置

我们处理异常一般在web.config文件中配置 <customErrors />节点:

 <customErrors mode="RemoteOnly" defaultRedirect="ErrorPage.aspx">
  
<error statusCode="403" redirect="NoAccess.htm" />
  
<error statusCode="404" redirect="FileNotFound.htm" />
 
</customErrors>
复制代码

节点中的一些属性,大家也应该很熟悉,我不罗嗦了。

  五 健康监视(Health Monitoring)
 
       Health Monitoring是ASP.NET2.0以后版本添加的新的特性。它可以允许开发人员监视应用程序中发生的异常的事件。而且监视应用程序的启动,关闭,验证等都有相对应的事件来监视。而且我们还可以创建自定义的事件来监视应用程序中的特定的部分。我们也可以在Health Monitoring中配置把应用程序中的异常是记录在系统的日志中还是Sql Server中,或者是以Email形式发送出去。最重要的一点就是:只要通过配置,我们可以少写,甚至不写代码就可以实现强大的异常处理策略(和类似Enterprise Application Blocks,我们后面会提到的)。

同样,我们还是在web.config中添加配置,在system.web节点中添加<healthMonitoring />节点:

默认情况下是禁用的,我们启用就应该如下:
 
 

ContractedBlock.gifExpandedBlockStart.gifCode
<healthMonitoring enabled=”true>
  
<eventMappings></eventMappings>
  
<providers></providers>
  
<rules>..</rules>
  
<profiles>..</profiles>
  
<bufferModes>..</bufferModes>
 
</healthMonitoring>

下面就看看该节点下的一些配置:
       eventMappings节点通过指定事件类型来注册事件类。也就说,要注明我们在应用程序中要监听哪些事件,如下配置:

 <eventMappings>
  
<clear />
  
<add name=”CustomException” type=”System.Web.Management.WebBaseErrorEvent” />
 
</eventMappings>
复制代码


 
       前面的"name"属性是我们自己为后面的事件取的友好的名称,从<eventMappings>的字面意思也可以知道:事件的映射。
       后面的"type"就是我们要在程序中监听的事件。之前也说过,我们可以监听很多的事件:系统的启动,关闭,验证失败等。

如上所见:"System.Web.Management.WebBaseErrorEvent" 是所有事件的基类。它的子类有很多:

WebApplicationLifetimeEvent--在应用程序的运行过程触发的事情,如,当应用程序开启,关闭时
       WebAuthenticationFailureAuditEvent--当ASP.NET验证失败是触发
       WebAuthenticationSuccessAuditEvent--验证成功时触发
       WebRequestErrorEvent--请求出错时触发
 
       除此之外,我们还可以自定义一些类,派生自基类。
 
 
       当我们确定了要监听的事件之后,我们就要选择事件的provider,也就说,事件触发后,我们把事情的信息记录到那里。
       配置如下:
 

 <providers>
  
<clear />
  
<add name=”EventLogProvider” type=”System.Web.Management.EventLogWebEventProvider” />
 
</providers>
复制代码


 
       这之前一样:System.Web.Management.EventLogWebEventProvider是个基类,有很多的子类,这些子类可以使得我们把异常的记录在如sql数据库中,系统日志中等:
       SqlWebEventProvider--把异常信息记录到数据库中的提供程序
       SimpleMailEventProvider--把异常信息通过Email发送的提供程序
 
       还有一些,大家参看MSDN。
 
       好了,到这里,我们把要监听的事件选择好了,如要监听WebApplicationLifetimeEvent,WebRequestErrorEvent;而且我们也准备把异常系统通过Email发送,我们选择了SimpleMailEventProvider,通过也想把异常记录到数据库中,我们也选择了SqlWebEventProvider。那么我们的配置就如下:

ContractedBlock.gifExpandedBlockStart.gifCode
<healthMonitoring enabled=”true>
  
<eventMappings>
   
<clear />
   
<add name=”CustomException” type=”System.Web.Management.WebApplicationLifetimeEvent” />
   
<add name=”AnotherException" type=”System.Web.Management.WebRequestErrorEvent” />
  
</eventMappings>

  
<providers>
   
<clear />
   
<add name=”EmailProvider” type=”System.Web.Management.SimpleMailEventProvider” />
   
<add name=”SqlProvider” type=”System.Web.Management.WebRequestErrorEvent” />
  
</providers>
  
 
</healthMonitoring>


         注意:providers节点中的"name"属性也是我们自己取的友好的名称。

好了,该定义的定义好了,现在还是不能按照我们的要求工作,那是因为我们还缺少一个"规则":
       如下:

ContractedBlock.gifExpandedBlockStart.gifCode
<rules>
  
<clear />
  
<add name=”Unhandled Exceptions Rule”
   eventName
=”Unhandled Exceptions”
   provider
=”EventLogProvider”
   
profile=”Default”
   
minInstances=”1”
   
maxLimit=”Infinite”
   
minInterval=”00:00:00” />
 
</rules>

 实际上,rules就是把我们之前定义的要监听的事件和相应的provider对象上来:
 
 
<rules>
  
<clear />
  
<add name=”MyRules1”
   
eventName=”CustomException”
   
provider=”EmailProvider”
   
profile=”Default”
   
minInstances=”1”
   
maxLimit=”Infinite”
   
minInterval=”00:00:00” />
 
</rules>


        注意上面的name属性,其实和之前一样,我们是给这个规则取个名字而已。eventName就是之前我们定义的事件名称,如"CustomException",provider为之前定义的“EmailProvider” ,本条规则就是说,让EmailProvider来处理CustomException的异常信息。其他的同理。
 
       最后一点要注意的就是:如果我们决定发送Email,那么我们还要配置节点:

<system.net>
  
<mailSettings>
   
<smtp deliveryMethod=”PickupDirectoryFromIis”>
    
<network defaultCredentials=”true” host=”127.0.0.1” />
   
</smtp>
  
</mailSettings>
 
</system.net>
复制代码

这样就行了。


       六 Enterprise Application Blocks

关于Enterprise Application Blocks,相信大家都知道,在异常处理的时候我们一般用Exception Handling Application Block(后面简称 :异常处理的模块),Logging Application Block。
       在决定用Enterprise Application Blocks的时候,我们必须首先下载安装包. 
       得到了安装包之后,我们就开始安装,如果在安装的过程中,全部采用默认的安装设置,那么我们就会有c:\EntLib4Src\Quick Starts文件夹。而且在ExceptionHandling\CS子文件夹下有ExceptionHandlingBasicQuickStart.sln 和ExceptionHanldingWithLoggingQuickStart.sln。打开ExceptionHandlingWithLoggingQuickStart解决方案,这个方案是个告诉我们如果使用异常处理模块的Demo。


       而且这个Demo是WinForm的,因为我们谈的是在ASP.NET使用异常处理的模块。所以我们谈谈在ASP.NET如何使用。
       在此之前,我们要熟悉一些配置节点,其实这些节点的结构和我们之前谈的"健康监视"很相似:

 <exceptionTypes>
  
<add name=”Exception” type=”System.Exception, mscorlib, Version=2.0.0.0,
   
Culture=neutral, PublicKeyToken=b77a5c561934e089” postHandlingAction=”None”>

 
</exceptionTypes>
复制代码


       上面节点表示要处理的异常,和之前的<eventMappings>相似。

 <exceptionHandlers>
  
<add name=”Application Message Handler” type=”ExceptionHandlingQuickStart.AppMessageExceptionHandler,
   
ExceptionHandlingWithLoggingQuickStart”/>
 
</exceptionHandlers>
复制代码

异常处理模块,就是异常发生后,如何处理。和之前的providers节点类似。
 
       下面的节点,看起来很吓人的,其实是声明异常信息以什么格式记录:

ContractedBlock.gifExpandedBlockStart.gifCode
<formatters>
  
<add name=”Default Formatter”
   type
=”Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter,
   
Microsoft.Practices.EnterpriseLibrary.Logging”
   template
=”Timestamp: {timestamp}
   Message: {message}
   Category: {category}
   Priority: {priority}
   EventId: {eventid}
   Severity: {severity}
   Title:{title}
   Machine: {machine}
   Application Domain: {appDomain}
   Process Id: {processId}
   Process Name: {processName}
   Win32 Thread Id: {win32ThreadId}
   Thread Name: {threadName}
   Extended Properties: {dictionary({key} - {value})}”
  
/>


       最后的节点如下,也不难理解,和之前说的rules节点类似:

ContractedBlock.gifExpandedBlockStart.gifCode
<listeners>
  
<add name=”Event Log Destination”
   type
=”Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.Formatt        edEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging”
    listenerDataType
=”   Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData,
   Microsoft.Practices.EnterpriseLibrary.Logging”
   source 
=”Enterprise Library Logging”
   formatter
=”Default Formatter”
  
/> 
 
 
</listeners>

其实Enterprise Application Blocks的功能不仅强大,而且还有最大的好处就是可以用GUI图形化的形式来配置,不必项之前一样要亲自在配置文件中写配置。而且在代码调用方面也很简单,几句话就OK了。

    说完上面的之后,我们就用图文结合的方式,展示如何使用异常处理模块。


       首先,我们把Program Files\Microsoft Enterprise Library 4.1 - October 2008\bin目录下的几个dll引入到我们的ASP.NET项目中:
       Microsoft.Practices.EnterpriseLibrary.Common
       Microsoft.Practices.EnterpriseLibrary.ExceptionHandling
       Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging
       Microsoft.Practices.EnterpriseLibrary.Logging
       Microsoft.Practices.ObjectBuilder2

下面开始配置:


       1.在我们的ASP.NET项目的web.config文件上点击右键,就会弹出"Edit Enterprise Library Configuration"选项。点击后就会看见如下界面:


       2.在弹出的界面中选中"web.config",点击右键 "新建"-"Logging Application Block",这样就把添加了日志记录的模块的节点,如下:

3.在默认情况下,在event log 的 trace listener节点有一个Trace Listeners,因为我们要发送Email,所以要添加个e-mail trace listener。在Trace Listeners点击右键,"新建"-"Email Trace Listener",之后就添加了"Email TraceListener"节点,然后选中"Email TraceListener",查看属性,可以设置发送Email的设置。如图:


并且设置Formatter属性并且选择"Text Formatter",设置信息格式为文本的形式。
 
       4.现在点击"web.config"添加异常handler。"新建"-"Exception Handling Application Block",如下:


 
       然后在"Exception Handling Application Block"上右击"新建"-"Exception Policy",然后我们可以重新命名为"MyPolicy".然后在"MyPolicy"上右键,选中"New Exception Type",然后选择我们要处理的异常,如图:


 
       我们一般是选择默认设置:处理所有异常。

好了,现在我们把事件的处理程序也添加了,那么下面就要加类似于"rules"的设置。
 
       5.在"Exception"节点上右击"新建"-"Logging Handler",然后选择"Logging Handler"节点,并且展开,选中"FormatterType",展开并且选"TextExceptionFormatter",最后确认就OK了。如下:
 

6.然后在点击"Logging Application Block\Special Source\All Events"的那个节点,右击"新建"-"Trace Listener Reference"添加"Trace Listener Reference",并且设置"ReferencedTrace Listener"属性为"Email Trace Listener",最后保存就行了。

7.我们在Global.asax文件下添加引用:

<%@ Import Namespace=”Microsoft.Practices.EnterpriseLibrary.ExceptionHandling” %>


       添加代码:

void Application_Error(object sender, EventArgs e)
 {
  
// Code that runs when an unhandled error occurs
  ExceptionPolicy.HandleException(Server.GetLastError(), “Global Policy”);
 }
复制代码


相关文章:

【经验】对一个合格C++高级工程师(音视频方向)的要求

1、C高级工程师 经过查看招聘网站上对“C高级工程师”这个职位的招聘要求&#xff0c;只总结了技术、能力要求&#xff0c;不涉及工作年限、学历 具体要求如下&#xff1a; 精通C面向对象程序设计&#xff1b; 熟悉设计模式&#xff1b; 敏捷开发经验&#xff1b; 扎实数据结…

马云:腾讯不是阿里要打败的对手,是同为社会创造价值的伴侣

整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;在甘肃敦煌举办的 2019 年中国绿公司年会上&#xff0c;阿里巴巴创始人、董事局主席马云谈及企业间的竞争时&#xff0c;提到了与腾讯的关系。他表示&#xff0c;没有腾讯&#xff0c;阿里…

Win10 | Mac 在server上统一办公

一个非常实际的问题&#xff0c;通常我们主要有三个工作的地点&#xff1a;1&#xff0c;server&#xff0c;用于大型数据的分析和处理&#xff1b;2&#xff0c;办公室的电脑&#xff0c;正式办公&#xff1b;3.自己的电脑&#xff0c;偶尔加班。 不同的工作平台之间很难同步&…

JDK5.0新特性系列---目录

JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列---4.静态导入 JDK5.0新特性系列---5.可变长参数Varargs JDK5.0新特性系列---6.格式化输出 JDK5.0新特性系列---7.使用Proce…

怎样搞定分类表格数据?有人用TF2.0构建了一套神经网络 | 技术头条

作者 | 王树义来源 | 玉树芝兰&#xff08;ID&#xff1a;nkwangshuyi&#xff09;以客户流失数据为例&#xff0c;看 Tensorflow 2.0 版本如何帮助我们快速构建表格&#xff08;结构化&#xff09;数据的神经网络分类模型。变化表格数据&#xff0c;你应该并不陌生。毕竟&…

【FFmpeg】Hello World!尝试如何编译FFmpeg程序

1、说明 下面的例子只演示,编译FFmpeg时用的头文件和库,不涉及编解码,只调用一个可以打印编译FFmpeg库的配置项的接口:avcodec_configuration() 2、avCfg.c #include <stdio.h> #include <libavcodec/avcodec.h>int main(int argc,char *argv[]

x-pack watch邮件报警配置

参考网址&#xff1a; https://www.cnblogs.com/reboot51/p/8328720.html https://www.elastic.co/guide/en/x-pack/5.6/actions-email.html #邮件设置 elasticsearch 配置 xpack.notification.email.account:exchange_account:profile: outlookemail_defaults:from: infomail.…

虚拟桌面的备份恢复最佳实践 第一部分

摘要 VMware View 是目前虚拟桌面市场的旗舰产品。借助它&#xff0c;企业可以将办公系统、应用和基础架构以高性能、高度可扩展的集中式托管服务形式交付给用户。View 还可提供保护它所支持的系统和应用以及相关用户数据所需的功能。它支持方便地备份和还原存档数据。 通常&…

Python程序员Debug利器,和Print说再见 | 技术头条

整理 | Rachel责编 | Jane出品 | Python大本营&#xff08;id&#xff1a;pythonnews&#xff09;【导语】程序员每日都在和 debug 相伴。新手程序员需要学习的 debug 手段复杂多样&#xff0c;设置断点、查看变量值……一些网站还专门针对debug撰写了新手教程。老司机们在大型…

【FFmpeg】解决警告warning: xxx is deprecated [-Wdeprecated-declarations]的方法

1、问题描述 编译FFmpeg程序时,经常报一些关于“deprecated”的警告信息,具体内容如下: decode.cpp:28:2: warning: ‘void av_register_all()’ is deprecated [-Wdeprecated-declarations]av_register_all(); decode.<

[BZOJ2527]Meteors

整体二分挺好玩的...学一发 这个询问显然是可以二分的&#xff0c;但每次都二分就会T爆&#xff0c;所以我们有了“整体”二分 每次处理一些询问&#xff0c;要求这些询问的答案一定在$[l,r]$中 先把$l$到$mid$的操作实施&#xff0c;那么当前TAK的询问答案一定在$[l,mid]$中&a…

一个可提供html5制作服务的网站

2019独角兽企业重金招聘Python工程师标准>>> 【TechWeb报道】最近网上出现了一个专门基于HTML5/CSS3制作服务的组织 P2H.cn. 就是专门提供网站切图的一项服务。特别在哪儿呢 &#xff0c;P2H.cn 可以制作出完美的兼容的html5/css3的页面。 王大利/文 如果你不知…

【Ubuntu】Ubuntu下的录频软件SimpleScreenRecorder

1、说明 官网介绍&#xff1a;https://www.maartenbaert.be/simplescreenrecorder/ 源码参见github&#xff1a;https://github.com/MaartenBaert/ssr 2、安装 Ubuntu版本>17.04&#xff0c;直接安装 sudo apt-get install simplescreenrecorderUbuntu版本<17.04&…

打开阿兹海默之门:华裔张复伦利用RNN成功解码脑电波,合成语音 | Nature

作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 年 4 月 24 日&#xff0c;来自加州大学旧金山分校&#xff08;UCSF&#xff09;神经外科学系 Gopala K. Anumanchipalli&#xff0c;Josh Chartier&#xff0c;Edward F. Chang 团队在 Nature 杂志上…

[转载] 别人的心得感悟

原文&#xff1a; https://www.cnblogs.com/double-K/p/6926367.html#commentform ---------------------------------------- 不可说的感悟-——十年老技术转型&#xff08;一&#xff09; 佛曰&#xff1a;“不可说&#xff0c;说既是错”&#xff0c;所以本篇也是错&#xf…

Windows Phone 7、XNA的旋转的背景

在游戏表现的过程中需要一些比较酷的动作&#xff0c;我们需要通过图型与XNA中的一些代码来实现&#xff0c;比如我们要说到的一个360度转动的圆。 在手机上的效果如下: 当然在这里我们看不到转动的效果&#xff0c;下边提供的有源码&#xff0c;大家可以下载运行测试一下。 操…

【Qt】报错error: undefined reference to `vtable for的解决方法

1、问题描述 编译Qt程序时&#xff0c;在某个类构造函数定义处报错&#xff1a; error: undefined reference to vtable for2、原因分析 导致错误信息的原因是&#xff1a;子类没有实现父类的纯虚函数&#xff1b; 在Qt中&#xff0c;首先要想到的是在一个类中添加了新的继承…

110万开发者的福音,百度Easy DL商品检测专业版上线

继首场百度大脑开放日上一口气开放24项全新AI技术后&#xff0c;4 月 25 日下午&#xff0c;第二期百度大脑开放日如约举行&#xff0c;本次共发布了13款AI通用新能力、5项技术升级&#xff0c;并推出了EasyDL商品检测专业版和语音识别自训练平台两大全新的可定制训练平台。 实…

简单爬虫学习记录

实现思路解析&#xff1a;爬虫调度器&#xff1a;启动/停止爬虫&#xff0c;规定爬虫的范围&#xff1b;URL管理器&#xff1a;管理2个URL&#xff1a;新的没有爬过的urls&#xff1b;旧的爬过的urls&#xff1b;URL下载器&#xff1a;下载url对应的html数据&#xff1b;HTML解…

开启笔记本win7的虚拟热点,让你的本本变成wifi

写在前面&#xff1a;相信很多人都跟我一样有困扰&#xff0c;在学校用校园网不能wifi&#xff0c;所以在此提供一个教程&#xff0c;希望能给机友们一些帮助。帖子转自网络&#xff0c;自己也测试过了。分享给大家&#xff0c;希望能给大家带来一些方便。开启windows 7的隐藏功…

检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0

解决方法&#xff1a;工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions -Version 2.1.1命令即可。 转载于:https://www.cnblogs.com/dashanboke/p/9229826.html

【FFmpeg】如何通过url的格式找到对应的协议,以rtmp为例

1、简述 在使用 avio_open 接口时,只要给形参 filename 传入 url 格式的字符串就能找到对应的协议。这篇博客就是追踪 avio_open 的调用关系,探明如何根据一个url字符串就能找到对应的协议。下面以rtmp协议为例。 2、FFmpeg对rtmp协议的支持 rtmp协议的实现源码在 libavfo…

李开复口中的“联邦学习” 到底是什么?| 技术头条

近日&#xff0c;在百大人物峰会上&#xff0c;创新工场创始人李开复谈及数据隐私保护和监管问题时&#xff0c;表示&#xff1a;“人们不应该只将人工智能带来的隐私问题视为一个监管问题&#xff0c;可尝试用‘以子之矛攻己之盾’——用更好的技术解决技术带来的挑战&#xf…

业务逻辑应该在哪里实现更为合理呢?

请大牛们讨论下业务逻辑应该在哪实现较为合理 1、java业务逻辑层。 2、后台存储过程。 因为本人一直都在业务逻辑层实现。但新项目中领导要求将业务写到后台存储过程&#xff0c;java业务逻辑层不承载业务逻辑的实现功能。 先说本人的观点&#xff1a; 本人偏向写在java业务逻辑…

前端不哭!最新优化性能经验分享来啦 | 技术头条

作者 | Dimitris Kiriakakis译者 | 风车云马编辑 | Jane出品 | Python大本营&#xff08;id&#xff1a;pythonnews&#xff09;【导语】Angular、React、VueJS 是现在一些主流的 JS 框架&#xff0c;那它们在构建网站或前端程序时&#xff0c;是如何保证性能&#xff0c;减少大…

【FFmpeg】如何通过字符串到对应的封装器,以flv为例

1、简述 使用avformat_alloc_output_context2创建封装器上下文AVFormatContext时,只需将封装器的名字传递给形参format_name,就可以获取对应的封装器。这篇博客就是追寻avformat_alloc_output_context2的调用关系,探明原因。 函数原型如下: int avformat_alloc_output_co…

坚持使用Override 注解(36)

2019独角兽企业重金招聘Python工程师标准>>> 1、覆盖超类时千万小心&#xff0c;一不小心就变成重载了 2、现代的IDE 会在覆盖父类方法而没有使用Override 时给出一个警告 在具体类中不必标注你确信覆盖了的抽象方法声明的方法&#xff08;虽然这样做没什么不好&…

sql语句动态创建连接服务器

--建立连接服务器 EXEC sp_addlinkedserver --要创建的链接服务器名称 DMZLINK,--产品名称 MS,--OLE DB 字符 SQLOLEDB,--数据源 192.168.0.68 EXEC sp_addlinkedsrvlogin DMZLINK, false, NULL, --远程服务器的登陆用户名 sa, --远程服务器的登陆密码 sa go 转载于:h…

【FFmpeg】FFmpeg中操作目录、文件的接口

1、简述 在学习FFmpeg源码中的例子时,发现FFmpeg封装了操作目录和文件的接口。这篇博客把这些接口罗列出来,作为笔记简单记录下。 2、接口列表 打开目录,准备读取目录信息 int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); 参数说明: u…

Scrapy爬取IT之家

创建项目 scrapy startproject ithome 创建CrawSpider scrapy genspider -t crawl IT ithome.com items.py 1 import scrapy 2 3 4 class IthomeItem(scrapy.Item): 5 # define the fields for your item here like: 6 # name scrapy.Field() 7 title scrapy.F…