Error Handling in VBScript or in UFT:
Errors are something which is a resultant of deviation from the assumption or requirement or rules via code. It may happen due to syntax mismatch, invalid user input or unavailability of system resources.
We have two types of Errors in VB Script; they are VBScript Run-time Errors and VBScript Syntax Errors
VBScript Run-time Errors
VBScript run-time errors are errors that result when our VBScript script attempts to perform an action that the system cannot execute. VBScript run-time errors occur while our script is being executed; when variable expressions are being evaluated, and memory is being dynamic allocated.
VBScript Syntax Errors
VBScript Syntax errors are errors that result when the structure of one of our VBScript statements violates one or more of the grammatical rules of the VBScript scripting language. VBScript syntax errors occur during the program compilation stage before the program has begun to be executed.
Errors in VBScript or UFT are broadly classified as
- Syntax Error
- Runtime Error
- Logic Error
Syntax Error aka Compilation Error
Every language follows a set of guidelines, rules, semantics etc. VBscript is also a language which has a set of rules, guidelines, semantics. Before or during executing a piece of code, VBScript engine checks the piece of code for the validity of those by parsing them and converting into tokens. In case VBScript engine encounters an unrecognizable code or expression, it flags the line as a syntax error.
VBscript halts the code execution due to the syntax error. VBScript engine reads the script file and tries to parse the code by converting into meaningful tokens. During this process, if the VBScript engine finds some unacceptable code format due to unrecognizable structure or expressions, it points out this as compilation error or Syntax error.
A syntax error is often coined as
- Pre-processor error
- Compilation error
- Compile-time error
Example of Syntax error:
Dim myMarks myMarks=66 If (myMarks>60) msgbox "Kudos you got 1st division" End If
Error: Expected Then
Now as the WSH provides clear error details, it is very easy to detect and rectify the Syntax errors.
VBscript does not support conditional compilation(an ability to execute different code base on different environments)
Why Syntax Error Occurs?
Below are the prime reasons why Syntax Error happens:
- If we miss providing mandatory structure information(like keywords, blocks, commas, parenthesis etc)
- Spelling mistake while using variables, procedures calls, function calls or expressions.
- Keywords related to other Microsoft tools(Excel, VBA etc) which are not supported by VBScript.
- Functions related to other Microsoft tools(Excel, VBA etc) which are not supported by VBScript. Mostly these functions need to be defined before using.
- VBScript has backward compatibility hence versions generally do not play a major role in a Syntax error. But Script written in higher VBScript version may not work well in the lower VBScript versions.
- Dynamic code generation and execution create a huge problem in VBScript(command like ExecuteGlobal, Execute or Eval needs extra care).
Common Syntax Error with Error code a Description
|Hexadecimal Error Code||Decimal Error Code||Comments|
|800A03E9||1001||“Out of memory” error.|
|800A040F||1039||“Invalid ‘exit’ statement” error.|
|800A0410||1040||“Invalid ‘for’ loop control variable” error|
|800A03ED||1005||“Expected ‘(‘ ” error.|
|800A0411||1041||“Name redefined” error.|
|800A03EE||1006||“Expected ‘)’ ” error.|
|800A0412||1042||“Must be the first statement on the line” error.|
|800A03F2||1010||“Expected identifier” error.|
|800A0414||1044||“Cannot use parentheses when calling a Sub” error.|
|800A03F3||1011||Expected ‘=’ error.|
|800A03F4||1012||Expected ‘If’ error.|
|800A0415||1045||“Expected literal constant” error.|
|800A03F5||1013||“Expected ‘To’ ” error.|
|800A0416||1046||“Expected ‘In’ ” error.|
|800A03F6||1014||“Expected ‘End’ ” error.|
|800A0418||1048||“Must be defined inside a Class” error.|
|800A0417||1047||“Expected ‘Class’ ” error.|
|800A03F7||1015||“Expected ‘Function’ “error.|
|800A0419||1049||“Expected Let , Set , or Get in property
|800A03F8||1016||“Expected ‘Sub’ ” error.|
|800A03F9||1017||“Expected ‘Then’ ” error.|
|800A041A||1050||“Expected ‘Property’ ” error.|
|800A03FA||1018||“Expected ‘Wend’ ” error.|
|800A041B||1051||“Number of arguments must be consistent across properties specification” error|
|800A03FB||1019||“Expected ‘Loop’ ” error.|
|800A041C||1052||“Cannot have multiple default property/method in a Class” error,|
|800A03FC||1020||“Expected ‘Next’ ” error.|
|800A041D||1053||“Class initialize or terminate do not have arguments” error.|
|800A03FD||1021||“Expected ‘Case’ ” error.|
|800A041E||1054||“Property Set or Let must have at least one argument” error.|
|800A03FE||1022||“Expected ‘Select’ ” error.|
|800A041F||1055||“Unexpected ‘Next’ ” error.|
|800A03FF||1023||“Expected expression” error.|
|800A0421||1057||” ‘Default’ specification must also specify ‘Public’ ” error.|
|800A0400||1024||“Expected statement” error.|
|800A0422||1058||” ‘Default’ specification can only be on property Get” error.|
|800A0401||1025||“Expected end of statement” error.|
|800A0402||1026||“Expected integer constant” error.|
|800A0403||1027||“Expected ‘While’ or ‘Until’ ” error.|
|800A0404||1028||“Expected ‘While’, ‘Until’, or end of statement” error.|
|800A0405||1029||“Expected ‘With’ ” error.|
|800A0406||1030||“Identifier too long” error.|
|800A0407||1013||“Invalid number” error.|
|800A0408||1014||“Invalid character” error.|
|800A0409||1015||“Undermined string constant” error|
|800A040A||1034||“Undermined comment” error.|
|800A040D||1037||“Invalid use of ‘Me’ keyword” error.|
|800A040E||1038||“‘loop’ without ‘do’ “error.|
|800A040E||1007||“Expected ]” error|
|800A040E||1031||“Invalid number” error|
|800A040E||1043||“Can not assign to non-ByVal argument” error|
|800A0420||1056||“Default’ can be specified only on ‘Property’ or ‘Function’ or ‘sub’ ” error|
A runtime error occurs when we try to perform a command on an invalid action. These codes get compiled as there is not a Syntax error but failed in the runtime and generate a Runtime error. Runtime errors are not the same as Syntax errors. Here the source information always is “Microsoft VBScript runtime error.”
Runtime errors are not easily detected during the development time of the script.
Why runtime error occurs?
- Based on certain security option’s enabled or disabled property.
- The used components are either down or not available.
- The execution platform may be different or other than script developed environment.
- Mismatch in script configuration.
- The executing box may be under tremendous stress or load.
Runtime errors can be classified as:
- Non VBScript Runtime error
- Native VBScript runtime error
- Variable declaration related due to Option Explicit runtime error.
Non-VBScript Runtime Error
These runtime errors are not generated by the VBScript engine. They are generated by some other components which are attached to VBScript.
Like ADO,ActiveX,DataObject etc..
Common Non-VBScript Runtime error codes:
Native VBScript Runtime Error
Native VBScript runtime error happens when the user performs some illegal operations. Mostly these errors are recorded and stored in VBScript Engine.
These errors happen when:
- One performs wrong arithmetic operations.
- Read from a database having a null value
- Keep reading even after the control reached at the End of File.
- Wrongly used Null in the expressions.
Example of Native Runtime Error
Option Explicit Dim myVar myVar=10/0 msgbox "The result is"+ myVar
Error-Division by zero
Example of Native Runtime Error
Dim myVar myVar=Null msgbox "The result is"+ myVar
Error-Invalid Use of Null
Errors Related to Option Explicit
Option explicit can be a very good tool during the development of the scripts. It acts as a safeguard against accidental spelling mistakes while working with Variables or a strange error which can not be viewed in naked eyes.
Option Explicit also refers to a variable that has not been declared. So if we get a runtime error for option explicit statement that “variable is undefined”.We need to check the declaration of the variables.
Example of Error due to Option Explicit
Option Explicit Dim index For index=0 to 10 If(index=5) Then myVar="Hello" Msgbox myVar Else msgbox index End If Next
This code will work fine till Index=4. As soon as the index becomes 5, the VBScript engine will throw an error stating myVar variable is undefined. Now if we examine our code carefully, we can see the variable myVar has never been declared.
When running a script,Option Explicit is neutralized and error is not caught but if a general error handler module is available, it will help us to defect the error and where the error has occurred.
How to avoid the Runtime Error
Since Runtime is critical than Syntax error, we need to understand how to avoid a Runtime error. Below are the guideline to avoid the runtime error.
- We need to be well versed with VBScript syntax, rules.
- We need to carefully read the documentation for functions or sub before working with them.
- If we get some different, not so well stated error messages or errors like Unspecified errors or Operations aborted or Error occurred etc. we need to surrender to Google. Daddy google has all kind of answer for any sort of problem.
- The last option is to use a trial and error method. Once we get the different type of solutions from Google we need to apply these techniques in our script.
- We need to use comments while we fix those errors so that we can later understand the purpose of the code we just inserted to our script.
Common Runtime Errors with Error Code and Description
|Hexadecimal Error Code||Decimal Error Code||Comments|
|800A0005||5||“Invalid procedure call / Invalid argument” error.|
|800A0006||6||“Stack overflow” error.|
|800A0007||7||“Out of memory” error.|
|800A0009||9||“SubScript out of Range” error.|
|800A000A||10||Array related error -“already locked or fixed” error.|
|800A000B||11||“Division by zero” error.|
|800A000D||13||“Type mismatch” error|
|800A000E||14||“String out of space” error.|
|800A0011||17||“Can’t perform requested operation” error.|
|800A001C||28||“Stack out of space” error.|
|800A01A8||424||“Object required” error|
|800A01AD||429||“ActiveX component can’t create object” error.|
|800A01AE||430||“Class doesn’t support Automation” error.|
|800A01B0||432||“Filename or class name not found during
Automation operation” error.
|800A0023||35||“Function or sub not defined” error.|
|800A0030||48||“Error in loading DLL” error|
|800A01B6||438||“Object doesn’t support this property or method” error.|
|800A01BD||445||“Object doesn’t support this action” error.|
|800A01BF||447||“Object doesn’t support current locale setting” error.|
|800A01C0||448||“Named argument not found” error.|
|800A01C1||449||“Argument not optional” error.|
|800A01C2||450||“Wrong number of arguments or invalid property assignment” error|
|800A01C3||451||“Object not a collection” error.|
|800A01CA||458||“Variable uses an Automation type not supported in VBScript” error.|
|800A01CE||462||“Remote server machine does not exist or is unavailable” error.|
|800A01E1||481||“Invalid picture” error.|
|800A01F4||500||“Variable is undefined” error.|
|800A01F6||502||“Object not safe for scripting” error.|
|800A005B||91||“Object variable not set” error.|
|800A005E||94||“Invalid use of Null” error|
|800A005C||92||“For loop not initialized” error|
|800A01F7||503||“Object not safe for initializing” error.|
|800A01F8||504||“Object not safe for creating” error.|
|800A01F9||505||“Invalid or unqualified reference” error.|
|800A01FA||506||“Class not defined error”.|
|800A01FB||507||“An exception occurred error.|
|800A1390||5008||“Illegal assignment” error.|
|800A1399||5017||“Syntax error in regular expression”|
|800A139A||5018||“Unexpected quantifier” error|
|800A139B||5019||Expected ‘]’ in regular expression error.|
|800A139C||5020||“Expected ‘)’ in regular expression” error.|
|800A139D||5021||“Invalid range in character set” error.|
|800A0034||52||“Bad file name number” error.|
|800A0035||53||“File not found” error.|
|800A0036||54||“Bad file mode” error.|
|800A0037||55||“File already open” error.|
|800A0039||57||“Device I/O error” error.|
|800A003A||58||“File already exists” error.|
|800A003D||61||“Disk full” error.|
|800A003E||62||“Input past end of file” error.|
|800A0043||67||“Too many files” error.|
|800A0044||68||“Device unavailable” error.|
|800A0046||70||“Permission denied” error.|
|800A0047||71||“Disk not ready” error.|
|800A004A||74||“Can’t rename with different drive” error.|
|800A004B||75||“Path/File access error” error.|
|800A004C||76||“Path not found” error.|
|800A0142||322||“Can not create necessary temporary file” error.|
|800A01BE||446||“Object does not support named arguments” error.|
|800A01C5||453||“Specified DLL function not found” error.|
|800A01C7||455||“Code resource lock error” error.|
|800A01C9||457||“This key is already associated with an element of this collection” error.|
|800A01F5||501||“Illegal assignment” error.|
|800A1398||5016||“Regular expression object required” error.|
|800A802B||32811||“Element not found” error.|
Logic errors are very tough to determine especially if a person debugs who never wrote the script. Logic errors are hidden inside our code and generally do not have a User Interface to show up. The only area we understand logic error when the piece of the code generates a wrong output. The output is different from what is desired. Otherwise, we can say that logic errors are bugs in the application.
How to avoid logic errors?
- We need to read the design specification, requirement documentation to understand the functionality and then inspect the code if that is doing what it is supposed to do.
- We need to follow “Divide and Develop” principal and implement stub and drivers in order to design our script sequentially correct.
- Check the code logic while using operators. or sendkeys.
- Use Custom runtime in different places.
- Testing is important to detect logic errors.
How to handle VBScript Errors in UFT or VBScript Editor?
VBScript does not support try-catch block to handle the error or exceptions, instead, it supports to provide a Global error handling mechanism. However, once the error occurs, VBScript engines invoke its internal error handling mechanism.
There are two strategies what we can do with the error:
- Fix it and get rid of the error
- Handle it
What is the Global Error Handling Scheme in VBScript/UFT?
The Global Error Handling Scheme includes:
- Display the error alert
- Logging mechanism
- Email the error
- Better code design in the error-prone area
- Use of Err object
- On Error Statement
Display the error alert
In this mechanism, the VBScript engine displays the error as an alert form. For standalone and small script it serves it purpose but not very effective while scripts are running in a batch mode. It often asks to hide the error. If the error could not be hidden, the execution stops and waits for the alert to be closed. This is a major pain point while running scripts in nightly mode or CDCTCI mode.
This is a nice feature to log the error to a different file instead of the display as an alert. The different file can be a flat file or an XML or a database or window event log. This process is hugely used in the current automation scenarios but very laid back or reactive approach.
Email the error
This mechanism puts a little dynamic behaviour to the error handling as the moment VBScript encounters an error an email gets triggered /fired to the specified group mentioned earlier. The group can decide the fate of the error then and there.
Better code to handle the error phone area
As and when automation gets matured, the automation engineers can decide where to put an extra set of code to protect known error. This extra set of code put a safety net around the risky code. This approach takes some time to mature and has no immediate implementation. This scheme also greatly depends on the code’s experience.
Use of Err Object
Err is an intrinsic object that has global scope. As a result, it is always available with VBScript Engine in the script. There is an Err object always in the memory. We do not need declare and initialize it. As it is already available and attached to our script, we do not need to create one using CreateObject() to create an Err. We also do not need to have a variable to hold this object.
Initially, the Err properties are
- Zero-length Strings
Once the err gets generated via runtime error, Err. Number contains an integer
Err object holds useful information about the error that occurs during script execution.
The Err objects provide us with the following properties:
- Number– It provides the error information that occurred last.
- Description-It returns a set of the descriptive string associated with an error. By default, it is a zero-length string.
- Source- It provides the last known component name from where the error occurred. It provides a class name or progID.
- Help File– It provides the path of the help file that is associated with Windows help file.
- Help Context– It provides a unique identifier if the error associated with a window help file. It is used very rarely.
The Err object also provides two methods:
- Clear()- This method clears or erases all properties of an Err object. So it makes Err a zero-length String or make it as 0.
- Raise()-This method helps us to generate a custom runtime error.
|Err||Err Object||Err Object|
|filePath||Integer||Option pointing to a help file|
Error Description syntax
|Err||Err Object||Err Object|
|Err||Err Object||Err Object|
|StrngExpression||String||An application that generates the error.|
|Err||Err Object||Err Object|
|filePath||Integer||Option pointing to a help file|
|Err||Err Object||Err Object|
|contextID||Integer||Option pointing to a help topic|
Details of Clear Method
The clear method has the following strategy to clear an Err object
- On Error Statement
- Exit Sub
- Exit Function
Syntax of a clear method
On Error Statement
On Error is kind of an alternative to try-catch. An upgraded error handling mechanism for VBScript or UFT among all other mechanisms.
On Error statement has two flavours
- On Error Goto Next
- On Error GoTo 0
On error GoTo Next
As the name suggests, it suppresses all the errors and transfers the control to the next line. It just tells the VBScript engine to ignore the errors. It suppresses the errors from the whole script (from functions, subs, classes etc). It feels very good to see that the scripts we have written do not have any error but this is very risky in the real-time scenario. We have to be very sure about the error before suppressing the same.
On Error Goto Next /On Error Resume Next can be localized just like a variable. This isolates the problem area from the remaining script.
On Error GoTo 0
While On Error Resume Next temporarily disables the error reporting, On Error GoTo 0 immediately enable error reporting. However, even though it is very useful but the automation team uses it very rarely.
Option Explicit Dim myVar On Error Resume Next myVar=getValueFromFlatFile() If(Err.Number=0) Then msgbox "No error" +myVar Else myDisplayError End If on Error GoTo 0 private function getValueFromFlatFile() Err.Raise VbObjectError+1000,"getValueFromFlatFile","An error has occured" End Function private Sub myDisplayError() msgbox "An error has occured" End Sub
This code On Error Resume Next and On Error GoTo 0 acts as try-catch block(used to handle error or exception in advanced languages).The code block expects an error from the getValueFromFlatFile() function and traps that.
Err. Number property is responsible for displaying relevant error information about the displaying error.
The guideline for setting up a trap or SafetyNet around the risky Code
- We can use On Error Resume Next just before the risky code.
- The risky code produces an ErrNumber as soon as the error occurs. If no error occurs it produces 0(zero).
- If an error occurs, we need to handle by any mean by using a loop or using email sending feature.
- Once the error is handled properly, we need to transfer the control back to its normal mode by On Error GoTo 0 statement.
- VBScript does not have a generic way of handling Error Exception(just like the Exception class in Java).
- We can set up multiple error trap to catch multiple errors.
- Generally, we use Wscript.Quit() method to stop the further execution of the script if we receive an error.
- In place of WScript.Quit() function we can also call any custom cleanup methods per our need. This is kind of finally block of java.
- In UFT/QTP we tend to put error handling code in respective functions, which logs and displays the sequential error message. This approach is often criticized as a poor or bad design principal.
What if We do not use Error trapping technique?
In this case, Wscript host(WHS) will take control and will display an error when it occurs. This technique gets visible with a popup which will not be doing all cleanup operations.
The popup mostly not self-closing hence may stop the batch execution. This is also a major roadblock of unattended execution while moving towards CDCTCI to DevOps. Hence it is considered a very inefficient technique.
However during the debugging process, to understand the error better, I would suggest not to trap the error info. Instead, display it in a user-friendly manner using Error objects various properties like
The upgraded way to move forward and implement CDCI or DevOps is to log the error message to a file by implementing logger functionality in a cleanup function.
VBScript Custom Error
VBScript also provides an option to generate a custom error. This feature enables us to react to an error in a user-friendly manner. When we do scripting, we consider several opportunities which may fail the script. We call them assumptions. Using code we try to cover as many assumptions as possible. These assumptions become rules or requirements for us. If in a case, we can not convert directly by code, we create a custom error.I n general, all possible cases need to be coded.
The syntax for custom error:
The Err.Raise() method enables us to simulate errors when we test our error handlers.
Err.Raise() method takes five arguments
- Err.Number- The range of custom error number is between 0 to 65535. However, 0 is not used in many cases as sometimes developer treats o as not an error.
- Err.Source- This is an optional parameter indicating the origin of the error.
- Err. Description-This is also an optional parameter indicating additional information about the error. (It is treated as Metadata about the error.)
- Helpfile-If the error corresponds to a VBScript helpfile, this info is displayed. We need to provide the path of the help file.
- If the error corresponds to a VBScript help file, this info is displayed. We need to provide the path of the help file.
In a script, if there are two consecutive errors come, the first error is overwritten by the second error. To get the correct error reporting it is good to clear the Err object.
If Err>0 then Err.Number=9999 Err.Description="A description that matches custom error" Mylogger.log(Err.Number & Err.Description) //this is just to log the Error Err.Clear End if
VBScript engine will automatically execute Clear() method when it encounters On Error Resume Next statement or Exit Sub or Exit Function statements .
When we should use Err.Raise() method?
Error information helps the coders to understand the actual issue. If in case Err.Raise() is used, it will automatically display the masked error message not the original error message. This will make the developers job tough. They will not be able to detect the original issue. Hence during development Err.Raise() should not be used but in production, it should be used.
It is important for us to identify the difference between error and problem statement. While using Custom error we need to provide nice, easy to understand the message to the user. Otherwise, the purpose to use custom, the user-defined error goes in vain.
Rules to generate Custom message:
- Do not use rude or harsh words.
- Use nice words to communicate the error in a descriptive way.
- Try providing a solution or a pointer on how to solve the current issue.
- Apologize for the error.
- Try putting code to recover from the error.
The objective of custom error is to communicate the user that the person has done something against the basic assumption of the code.
Capture or Not to Capture an Error
It is also a very important to point to decide if we need to capture the error or we should not capture in the script. If we are building small utility to automate something and the script will not be part of the larger framework, we often do not capture the error.
But if you are building a script that will be part of the automation framework, we need to capture the Error messages. It only not only help in debugging but also help us to understand the root cause of the error.
How to Correct Error 80004005
Mistake 80004005 is most likely one of the most aggravating items at any time to be flashed on your computer monitor. Most laptop errors are really particular to a variety of software’s or functions. Mistake 80004005, however, appears to be an alternatively generic mistake code as it has a tendency to pop up for all types of explanations.
A further time the error will manifest is when it has complications connecting. You may possibly get error information that says you will find a login failure, or it may say anything like “SQL Permissions Trouble”. Possibilities are that this is another mistake in permissions. The will cause for this connectivity challenge can selection vastly in the place the authorization challenge is coming into participating in. Spend notice to the verbiage the error display. It will hopefully give you hints on exactly where to start trouble capturing.
You could have enter information improperly, triggering the 80004005 mistakes. For instance, if you get this error right after making an attempt to submit facts with figures like a mobile phone number or a social security selection, consider going again and coming into them as strings as a substitute of straight figures. For occasion, alternatively of putting a telephone range like 5551234, but 555-1234.
Error 80004005 may possibly occur up whilst you might be striving to log in to your immediate messenger. The very first thing to do if this transpires is to examine and see if you’ve got obtained the latest edition. Most quick messengers do regular updates with new features and script. Older versions can quickly become obsolete. It is really a good concept to update each time prompted to do so, and just about every so usually (each and every couple of months) go to the immediate messenger’s internet site to see if there is certainly a newer edition you could be applying.
A further thing to try if you might be provided with the mistake code while working with an instantaneous messenger is to delete the cache information affiliated with it. Relying on which messenger you happen to be employing and which version of Home windows, this may be completed any of a handful of ways, so do a rapid search for actual particulars supplied the versions you are operating with.
And finally and most popular, if you have a world-wide-web protection plan (e.g. parental command, antivirus) there may be corrupted documents. Use a tool that quickly fixes corrupted information and registry entries.
Correcting Home windows Registry Errors With a Registry Cleaner
While testing VbScript or playing with VbScript we often corrupt the registry. In this case, we need a solution to come to our primary settings. Struggling with registry glitches usually is a widespread dilemma for Home windows buyers. From time to time it is challenging even to trace that the dilemma is linked with the registry.
You might be contemplating that how does the personal computer come to be gradual mainly because of the registry! When you install packages and hardware into your computer system and each individual time you do this it places an entry in the Home windows registry. But when you no for a longer period will need that system and uninstall it, Windows won’t delete the entry.
And the additional time when setting up and uninstall systems and components it provides much more entries and far more entries. So now the personal computer has to go through all these entries to discover what it is seeking.
This makes a number of challenges like –
- Slow boot uptime
- You expertise sluggish pc general performance from the personal computer even with lower source consumes computer software.
- Blue display screen makes you black!
- You see mistakes in scripts.
- Kernal32 dll error
- Anything pop-outs showing runtime error
- Microsoft VBScript mistake
- Slow web speed
- whilst searching you see 404 mistake
These are some pretty widespread glitches that relate to the home windows registry. The resolution is clear sweep the registry to make it no cost from overpowering invalid entries. It’s doable for a specialist to do that manually but if you are not a specialist “do not consider it at home”! Any mistaken try can conclude up to anything incredibly messy. The safest way is to use a registry cleaning instrument which is professionally developed to carry out.
There is a whole lot of merchandise in the current market. Quite a few of them are totally free. Make a search on the web, you will find plenty of them. Now-a-times quite a few antivirus products and solutions as well anti-spyware products are which includes registry cleaner into their deal.